Я знаю, что эта тема была избита до смерти, но я не смог найти решение проблемы, с которой я столкнулся на SO или где-либо еще, поэтому я подозреваю, что где-то в моей системе может быть ошибка.
Я на старой платформе RHEL 6 с Python 3.4. Я разрабатываю приложение, которое будет работать на этой платформе, использующей Qt. Я установил все соответствующие библиотеки через yum
(например, qt-devel
, pyqt4-devel
и т. д.) и теперь хочу установить пакет своего приложения как «редактируемый» пакет с помощью pip install -e mypkg
. У меня также есть несколько требований к зависимостям, которых нет в yum
, и их нужно установить через pip
.
Что я хотел бы сделать, так это создать virtualenv, который «наследует» системные пакеты, установленные через yum
, но позволяет мне pip install
мои собственные пакеты в каталог virtualenv в моем домашнем каталоге.
Из моего поиска в Google кажется, что лучший способ сделать это — создать виртуальную среду с системным каталогом пакетов сайта:
$ python3 -m venv --system-site-packages ~/venv
Однако, когда я пытаюсь установить пакет в каталог site-packages этого virtualenv, он пытается установить его под /usr/lib
, и я получаю ошибку Permission denied
.
Таким образом, похоже, что опция --system-site-packages
заставляет мой virtualenv полностью использовать каталог site-packages из моей системы вместо того, чтобы использовать его в качестве «базы», где дополнительные пакеты могут быть размещены поверх.
Этот ответ утверждает, что использование pip install -I
должно делать то, что я хочу, но, похоже, это не так:
(venv) $ pip3 install -I bitstring
...
error: could not create '/usr/lib/python3.4/site-packages/bitstring.py': Permission denied
@marcanuy Да, я попытался указать это с помощью (venv)
в строке приглашения.
Вы уверены, что вам нужно настроить виртуальную среду для использования системных пакетов? Кажется, я припоминаю, что пакеты, установленные через yum
или apt
, доступны в виртуальных средах даже без включения системных пакетов (к моему большому удивлению в то время). Я бы хотя бы протестировал.
@ jpmc26 Это кажется разумным, но, увы, я не думаю, что это так: >>> import sys; print(sys.path)
показывает ['', '/usr/lib64/python34.zip', '/usr/lib/python3.4', '/usr/lib64/python3.4/plat-linux', '/usr/lib64/python3.4/lib-dynload', '$HOME/venv/lib64/python3.4/site-packages', '$HOME/venv/lib/python3.4/site-packages']
, чего не хватает /usr/lib64/python3.4/site-packages
@GregAnders Нет, нет. Просто попробуйте импортировать модуль. Например, from PyQt4 import QtGui
. Если не работает, то не работает, но насколько я помню, работает (по крайней мере, в некоторых случаях). Возможно, он будет установлен в одном из других мест в вашем списке.
@jpmc26 jpmc26 Я попробовал это с numpy (также установленным через yum) и получил ImportError: No module named 'numpy'
Создайте виртуальную среду без переключателя --system-site-packages
. После создания среды перейдите в папку, в которой была создана среда. В ней должен быть файл pyvenv.cfg
. Отредактируйте этот файл. В нем есть (среди прочего текста) строка
include-system-site-packages = false
Измените эту строку на:
include-system-site-packages = true
Активируйте среду. Установки модулей теперь будут проходить в виртуальную среду, и пакеты системного сайта также будут видны.
Как я могу настроить общий доступ только к некоторым библиотекам?
С Python 3.8 кажется, что --system-site-packages
работает так, как ожидалось:
python3 -m venv --system-site-packages myProject
cat myProject/pyvenv.cfg
home = /usr/bin
include-system-site-packages = true
version = 3.8.5
После установки astroid, isort, wrapt
я получил:
pip list -v
Package Version Location Installer
---------------------- -------------------- ------------------------------------------------------- ---------
apturl 0.5.2 /usr/lib/python3/dist-packages
astroid 2.4.2 /home/to/no/MR/auto-gen/lib/python3.8/site-packages pip
isort 5.6.4 /home/to/no/MR/auto-gen/lib/python3.8/site-packages pip
jedi 0.15.2 /usr/lib/python3/dist-packages
keyring 18.0.1 /usr/lib/python3/dist-packages
wrapt 1.12.1 /home/to/no/MR/auto-gen/lib/python3.8/site-packages pip
Уже установленные «системные» пакеты берутся из /usr/lib/python3/dist-packages
, а локально (venv) установленные пакеты из: /home/to/no/MR/auto-gen/lib/python3.8/site-packages
Вы активировали виртуальную среду, прежде чем снова пытаться использовать pip?