Как добавить путь к PYTHONPATH в virtualenv


97

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

Я пробовал SET PYTHONPATH=...использовать командную строку virtualenv, но она устанавливает переменную для всей среды.

Как мне этого добиться?

Ответы:


155

Обычно вы можете избежать каких-либо действий с PYTHONPATH, используя .pthфайлы . Просто поместите файл с расширением .pth (работает любое базовое имя) в папку пакетов сайта virtualenv, например lib\python2.7\site-packages, указав абсолютный путь к каталогу, содержащему ваш пакет, как его единственное содержимое.


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

Кроме того, если вы знаете абсолютный путь, в чем смысл переменной?
Джейми Маршалл

вы также можете перейти в папку site-packages вашей виртуальной среды и создать символическую ссылку на файл .pth, например: ln -s path / to / somfile.pth. Я нашел это полезным, когда мне нужно было, чтобы один и тот же каталог был доступен в нескольких виртуальных средах
Data-phile

91

Если вы используете virtualenv, вам, вероятно, также следует использовать virtualenvwrapper , и в этом случае вы можете использовать команду add2virtualenv для добавления путей к пути Python для текущего virtualenv:

add2virtualenv directory1 directory2 …


3
Как насчет удаления из virtualenv?
silverdagger

1
Я хочу добавить дружеский комментарий о том, что на общих хостах и ​​подобных ситуациях оболочка venv нежелательна. В таких случаях действует один venv, и все, что необходимо для дополнительной установки, нежелательно. Локально все по-другому, но на сервере / образе KISS действительно важен.
Marc

2
Я не уверен, как команда работала, когда это было написано, но add2virtualenvне изменяет $ PYTHONPATH, а изменяет sys.path.
ForeverWintr

1
@ajostergaard: Извините, я должен был предоставить источник. Если вы посмотрите исходный код add2virtualenv, вы увидите, что он изменяет sys.path. Я согласен с тем, что в документации звучит так, будто это изменяет PYTHONPATHпеременную среды, но это кажется неверным. bitbucket.org/virtualenvwrapper/virtualenvwrapper/src/…
ForeverWintr 03

1
@ForeverWintr Я поправляюсь - файлы .pth используются для установки sys.path. docs.python.org/2/library/site.html Confused.com!
ostergaard 03 окт.2016,

5

Вы также можете попробовать разместить символическую ссылку на один из ваших файлов virtualenv.

например. 1) активируйте свой virtualenv 2) запустите python 3) импортируйте sys и проверьте sys.path 4) вы найдете там путь поиска python. Выберите один из них (например, site-packages) 5) перейдите туда и создайте символическую ссылку на свой пакет, например: ln -s path-to-your-package name-with-which-you-be-importing

Таким образом, вы сможете импортировать его, даже не активируя файл virtualenv. Просто попробуйте: path-to-your-virtualenv-folder / bin / python и импортируйте свой пакет.


Я предполагаю, что это было отклонено за использование символических ссылок, а не файлов .pth. Однако у меня это сработало, так что, как бы то ни было.
Гарет Дэвидсон,

3

Если вы используете virtualenvwrapper,

$ cd to the parent folder
$ add2virtualenv  folder_to_add

консоль отобразит

Warning: Converting "folder_to_add" to "/absoutle/path/to/folder_to_add"

Вот и все, и вам должно быть хорошо идти


1
import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print("current working dir: %s" % dir_path)

sys.path.insert(0, dir_path)

Я настоятельно рекомендую вам использовать virtualenv и virtualenvwrapper, чтобы не загромождать путь.


если вы хотите, чтобы это работало с любой версией Python, просто используйте обычный строковый формат в старом стиле, а не причудливую f-строку f "... {dir_path}"
Гийом С

Спасибо за комментарий. Пересмотрел для использования. старые методы громоздки и своеобразны, и в простой системе шаблонов нет ничего особенного
Rubber Duck

Все относительно :)
Guillaume S
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.