Постоянно добавлять в каталог PYTHONPATH


всякий раз, когда я использую sys.path.append новый каталог будут добавлены. Однако, как только я закрою python, список вернется к предыдущему (по умолчанию?) значения. Как мне постоянно добавлять каталог в PYTHONPATH?

14 241

14 ответов:

вам нужно добавить новый каталог в переменную окружения PYTHONPATH, отделенный двоеточием от его предыдущего содержимого. В любой форме Unix вы можете сделать это в сценарии запуска, соответствующем любой оболочке, которую вы используете (.profile или любой другой, в зависимости от вашей любимой оболочки) с командой, которая, опять же, зависит от оболочки; в Windows, вы можете сделать это через GUI система для этой цели.

superuser.com может быть лучше спросить дальше, т. е. более подробно, если вам нужна конкретика о том, как обогатить переменную среды в выбранной вами платформе и оболочке, так как это не совсем вопрос программирования как таковой.

Если вы используете bash (на Mac или GNU / Linux дистрибутиве), добавьте это в свой ~/.bashrc

export PYTHONPATH="${PYTHONPATH}:/my/other/path"

вместо того, чтобы манипулировать PYTHONPATH вы также можете создать настройки путь к файлу. Сначала узнайте, в каком каталоге Python ищет эту информацию:

python -m site --user-site

по какой-то причине это не работает в Python 2.7. Там вы можете использовать:

python -c 'import site; site._script()' --user-site

затем создать .pth файл в этом каталоге, содержащий путь, который вы хотите добавить (создайте каталог, если он не существует).

например:

# find directory
SITEDIR=$(python -m site --user-site)

# create if it doesn't exist
mkdir -p "$SITEDIR"

# create new .pth file with our path
echo "$HOME/foo/bar" > "$SITEDIR/somelib.pth"

Это работает на Windows

  1. В Windows с Python 2.7 перейдите в папку установки Python.
  2. открыть Lib / site-пакеты.
  3. добавить пример.PTH пустой файл в эту папку.
  4. добавить путь к файлу, по одному в каждой строке.

тогда вы сможете увидеть все модули в этих путях из ваших скриптов.

в случае, если кто-то все еще смущен - если вы находитесь на Mac, выполните следующие действия:

  1. открыть терминал
  2. тип open .bash_profile
  3. в текстовом файле, который появляется, добавьте эту строку в конце: export PYTHONPATH=$PYTHONPATH:foo/bar
  4. сохраните файл, перезагрузите терминал, и все готово

вы можете добавить путь через файл pythonrc, который по умолчанию равен ~/.pythonrc на linux. то есть.

import sys
sys.path.append('/path/to/dir')

вы также можете установить PYTHONPATH переменная окружения, в глобальном rc-файле, такая ~/.profile на mac или linux, или через Панель управления -> Система -> вкладка Дополнительно -> Переменные среды в windows.

чтобы дать немного больше объяснений, Python автоматически построит свои пути поиска (как уже упоминалось выше и здесь) С помощью site.py скрипт (обычно находится в sys.префикс + lib/python<version>/site-packages а также lib/site-python). Можно получить значение sys.префикс:

python -c 'import sys; print(sys.prefix)'

site.py затем скрипт добавляет несколько каталогов, зависящих от платформы, например /usr/{lib,share}/python<version>/dist-packages,/usr/local/lib/python<version>/dist-packages на пути поиска и поиски эти пути для <package>.pth конфигурационные файлы, которые содержат специфические дополнительные пути поиска. Например простая установка поддерживает свою коллекцию установленных пакетов, которые добавляются в системный файл, например, на Ubuntu это /usr/local/lib/python2.7/dist-packages/easy-install.pth. На типичной системе есть куча таких .PTH файлы, вокруг которых можно объяснить некоторые неожиданные пути в sys.путь:

python -c 'import sys; print(sys.path)'

так что можно создать .PTH файл и положить в любой из этих каталогов (в том числе sitedir, как уже упоминалось выше). Это, по-видимому, способ добавления большинства пакетов в систему.путь в отличие от использования PYTHONPATH.

Примечание: на OSX есть специальный дополнительный путь поиска, добавленный site.py для "сборки фреймворка" (но, похоже, работает для обычного использования командной строки python):/Library/Python/<version>/site-packages (например, для Python2. 7:/Library/Python/2.7/site-packages/), где должны быть установлены сторонние пакеты (см. README в этом каталоге). Таким образом, можно добавить файл конфигурации пути, содержащий дополнительные пути поиска, например, создать файл с именем /Library/Python/2.7/site-packages/pip-usr-local.pth, которая содержит /usr/local/lib/python2.7/site-packages/ и тогда система python добавит этот путь поиска.

в linux вы можете создать символическую ссылку из вашего пакета в каталог PYTHONPATH без необходимости иметь дело с переменными среды. Что-то вроде:

ln -s /your/path /usr/lib/pymodules/python2.7/

для меня это сработало, когда я изменил . Просто меняется .bashrc файл работал только до тех пор, пока я не перезапустил оболочку.

для Python 2.7 это должно выглядеть так:

export PYTHONPATH="$PYTHONPATH:/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python"

в конце .

просто чтобы добавить ответ awesomo, вы также можете добавить эту строку в свой ~/.bash_profile или ~/.profile

добавлять export PYTHONPATH="${PYTHONPATH}:/my/other/path" в ~/.bashrc может не работать, если PYTHONPATH в настоящее время не существует (из-за :).

export PYTHONPATH="/my/other/path1"
export PYTHONPATH="${PYTHONPATH}:/my/other/path2"

добавление в мой ~/.bashrc сделал трюк для меня на Ubuntu 16.04

Я добавил постоянно в Windows Vista, в языке Python 3.5

система > Панель управления > расширенные системные Настройки > Расширенные (нажмите) Переменные среды > системные переменные > (если вы не видите PYTHONPATH в столбце переменных) (нажмите) Создать > имя переменной: PYTHONPATH > значение переменной:

пожалуйста, запишите каталог в значение переменной. Это детали ответа голубого перца.

в Python 3.6.4 вы можете сохранить sys.путь через сеансы python, как это:

import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print(f"current working dir: {dir_path}")

root_dir = dir_path.replace("/util", '', 1)
print(f"root dir: {root_dir}")

sys.path.insert(0, root_dir)

print(str(sys.path))

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

скрипт ниже работает на всех платформах, так как это чистый Python. Он использует путь pathlib, задокументированный здесь https://docs.python.org/3/library/pathlib.html, чтобы заставить его работать кросс-платформенный. Вы запустите его один раз, перезагрузите ядро и все. Вдохновленный https://medium.com/@arnaud.bertrand/modifying-python-s-search-path-with-pth-files-2a41a4143574.

from pathlib import Path
to_add=Path(path_of_directory_to_add)
from sys import path

if str(to_add) not in path:
    minLen=999999
    for index,directory in enumerate(path):
        if 'site-packages' in directory and len(directory)<=minLen:
            minLen=len(directory)
            stpi=index

    pathSitePckgs=Path(path[stpi])
    with open(str(pathSitePckgs/'current_machine_paths.pth'),'w') as pth_file:
        pth_file.write(str(to_add))