Почему мои пакеты pip для virtualenv находятся в моем каталоге lib / python2.7?

В моем доме у меня есть каталог с именем lib/python2.7 (на самом деле таких каталогов пять для разных версий Python). Поскольку это общий хостинг (Webfaction), этот каталог имеет для меня основополагающее значение. Там у меня установлены такие вещи, как virtualenv и virtualenvwrapper, поскольку как клиент общего хостинга у меня нет доступа к sudo и установке глобальных пакетов.

Однако, когда я создаю virtualenv:

$ mkvirtualenv myenvironment
$ workon myenvironment
$ which pip
# outputs the myenvironment's path to pip
$ pip freeze

Команда показывает весь список пакетов под моим lib/python2.7 (включая те же пакеты virtualenv и конфликтующие пакеты, которые у меня есть из-за ... устаревших ... причин). Это также меня раздражает, если я хочу установить пакет, который является именем пакета в lib/python2.7, поскольку он не позволяет мне его обновлять.

Прямо в среде workon я пытаюсь проверить, есть ли в PYTHONPATH странные вещи, но он пуст:

$ echo $PYTHONPATH
# shows a blank line

Он также будет пустым, если я попробую эту команду из любой виртуальной среды.

Кажется, что --no-site-packages используется по умолчанию, но решает лишь часть проблемы. Это означает: pip freeze | wc -l отображает меньшее значение в среде, чем при выполнении глобально, вне любой среды, что говорит мне, что есть определенные уже предоставленные пакеты, которые исключаются и находятся на самом хостинге (и не установлены мной, поскольку (опять же, хостинг общий, и у меня нет доступа к глобальному пространству).

Мой вопрос: как я могу это решить? Я хочу, чтобы мой virtualenv не отображал пакеты в $HOME/lib/python2.7

Избегайте дублирования ссылок на этот вопрос, там ничего не было полезного и до сих пор нет принятого ответа. Я написал этот вопрос, прочитав и попробовав каждое решение в этом вопросе


person Luis Masuelli    schedule 18.05.2016    source источник


Ответы (2)


Я думаю, вам нужно указать версию python. Вы можете указать версию Python, с которой вы хотите создать виртуальную среду, используя команду типа

virtualenv -p /usr/bin/python3.4 virt/virtname --no-site-packages

Поскольку, когда вы не указываете версию python, virtualenv создает среду с pythonv2.7, и, следовательно, все пакеты попадают в указанную вами папку.

person Rajesh Yogeshwar    schedule 18.05.2016
comment
У меня это сработало, но формат флага -p был другим: virtualenv --python=python3.6 --no-site-packages venv. По умолчанию это интерпретатор, с которым был установлен virtualenv. - person Jack; 03.11.2019

Нашел решение после глубокого копания. Это настраиваемая веб-фракция, но она может относиться к любой подобной установке, если возникнет проблема.

Суть проблемы в том, что Webfaction настроила для нас файл sitecustomize.py. Файл расположен в /usr/local/lib/pythonX.Y/sitecustomize.py и сам добавляет содержимое ~/lib/pythonX.Y (и, условно, содержимое любого приложения python в ~/webapps, если вы работаете в его каталоге для запуска сценария python).

Даже когда исполняемый файл python virtualenv является другим, он будет загружать указанный файл sitecustomize.py каждый раз, когда запускается, как это делает базовый исполняемый файл python.

Обходной путь здесь? Создайте в своем virtualenv пустой sitecustomize.py, чтобы переопределить другой:

touch ~/.virtualenvs/yourvenv/lib/pythonX.Y/sitecustomize.py

И это сработает.

Примечания: замените X.Y в каждом случае соответствующей версией, с которой вы работаете. Кроме того, помните: Вы не можете удалить или отредактировать базовый sitecustomize.py, так как в этом случае вы находитесь на общем хостинге. Однако переопределение будет работать для каждого случая, если вы сделаете это для каждого желаемого виртуального сервера.

person Luis Masuelli    schedule 18.05.2016