Как добавить путь к 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