Установка локальных пакетов с помощью Python virtualenv --system-site-packages

Я знаю, что эта тема была избита до смерти, но я не смог найти решение проблемы, с которой я столкнулся на 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

Вы активировали виртуальную среду, прежде чем снова пытаться использовать pip?

marcanuy 09.04.2019 21:42

@marcanuy Да, я попытался указать это с помощью (venv) в строке приглашения.

gpanders 09.04.2019 22:07

Вы уверены, что вам нужно настроить виртуальную среду для использования системных пакетов? Кажется, я припоминаю, что пакеты, установленные через yum или apt, доступны в виртуальных средах даже без включения системных пакетов (к моему большому удивлению в то время). Я бы хотя бы протестировал.

jpmc26 10.04.2019 00:12

@ 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

gpanders 10.04.2019 00:16

@GregAnders Нет, нет. Просто попробуйте импортировать модуль. Например, from PyQt4 import QtGui. Если не работает, то не работает, но насколько я помню, работает (по крайней мере, в некоторых случаях). Возможно, он будет установлен в одном из других мест в вашем списке.

jpmc26 10.04.2019 00:19

@jpmc26 jpmc26 Я попробовал это с numpy (также установленным через yum) и получил ImportError: No module named 'numpy'

gpanders 10.04.2019 00:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
9
6
8 969
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Создайте виртуальную среду без переключателя --system-site-packages. После создания среды перейдите в папку, в которой была создана среда. В ней должен быть файл pyvenv.cfg. Отредактируйте этот файл. В нем есть (среди прочего текста) строка

include-system-site-packages = false

Измените эту строку на:

include-system-site-packages = true

Активируйте среду. Установки модулей теперь будут проходить в виртуальную среду, и пакеты системного сайта также будут видны.

stackoverflow.com/a/40989759/8676953 также может быть хорошим ответом, поскольку он предоставляет ссылку на соответствующую проблему.
de1 24.06.2019 14:00

Как я могу настроить общий доступ только к некоторым библиотекам?

GoingMyWay 07.07.2019 17:51

С 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

Другие вопросы по теме