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

258

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

Теги:
pythonpath
save
sys

16 ответов

107
Лучший ответ

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

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

  • 8
    Ошибка: разделитель на окнах будет точка с запятой. Если вам нужно переопределить системные пути в окнах, настройка через GUI в качестве переменной среды пользователя может быть недостаточной, так как переменные пользователя добавляются к системным переменным. В этих случаях вам нужно прибегнуть к сценарию запуска, который вносит необходимые изменения.
  • 1
    @Nathan, tx для напоминания о точке с запятой, но (если вы, конечно, администратор) вы можете установить системный env.vars на окнах (плюс, OP не спрашивает, как переопределить путь, просто как добавить к нему) Таким образом, пользователь env.var также подойдет для этого! -).
Показать ещё 1 комментарий
364

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

export PYTHONPATH="${PYTHONPATH}:/my/other/path"
  • 21
    Это отлично сработало для меня, но убедитесь, что каталог, на который вы указываете, имеет самый верхний файл init .py в вашей структуре каталогов. Сначала это было не совсем понятно для меня. Например, я попытался экспортировать PYTHONPATH = $ PYTHONPATH: / Users / joey / repos, но это не сработало, поскольку в моем каталоге repos не было _ init_ .py. Идем дальше на один каталог: / Users / joey / repos / specificRepo сделали свое дело. Теперь python может проходить через любой нисходящий каталог, связанный с каталогом specificRepo, который содержит init .py!
  • 2
    это сработало для меня, но не могли бы вы объяснить, где находится эта переменная PYTHONPATH? и как "export PYTHONPATH" узнает, где находится этот файл?
Показать ещё 5 комментариев
75

Вместо манипулирования 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"
  • 0
    Я пробовал это с помощью Python 2.6, и это не похоже на работу для меня
  • 4
    Я просто поставил ссылку на этот каталог в свой каталог библиотеки и сохранил там все свои скрипты. Работал нормально.
Показать ещё 8 комментариев
25

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

  • В Windows с Python 2.7 перейдите в папку настройки Python.
  • Откройте Lib/site-packages.
  • Добавьте в эту папку example.pth пустой файл.
  • Добавьте путь к файлу, по одному на каждую строку.

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

  • 3
    ИМО, это лучшее решение, так как оно не зависит от выбора оболочки или рабочей среды. Работает и в Linux, где путь к Python по умолчанию - "/usr/local/lib/pythonX.Y/site-packages". Если это не сработает, попробуйте поместить ваш файл .pth в каталог dist-packages.
  • 0
    Windows 7, Python 3.6.5. Это ответ. Как писал auserdude: создайте «example.pth» в папке Python lib / site-packages, а затем добавьте свой путь следующим образом: C: \ somefolder \ anotherfolder \ targetfolder
Показать ещё 1 комментарий
19

Если кто-то все еще запутался - если вы на Mac, сделайте следующее:

  • Открыть терминал
  • Тип open .bash_profile
  • В текстовом файле, который появляется, добавьте эту строку в конец: export PYTHONPATH=$PYTHONPATH:foo/bar
  • Сохраните файл, перезапустите терминал, и вы закончили.
  • 0
    Любой, кто интересуется, как увидеть путь Python, используйте: какой Python
  • 0
    уверен, что вам нужно перезагрузить терминал
19

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

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

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

  • 37
    sys.path.append ('/ path / to / dir') не добавляет запись навсегда.
12

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

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 файлов конфигурации, которые содержат конкретные дополнительные пути поиска. Например, easy-install поддерживает свою коллекцию установленных пакетов, которые добавляются в системный файл, например, на Ubuntu it /usr/local/lib/python2.7/dist-packages/easy-install.pth. В типичной системе есть куча этих.pth файлов, вокруг которых можно объяснить некоторые неожиданные пути в sys.path:

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

Таким образом, можно создать файл.pth и поместить в любой из этих каталогов (включая sitedir, как указано выше). Кажется, что большинство пакетов добавляются к sys.path, а не к 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 добавит этот путь поиска.

  • 2
    Это лучший ответ из всех найденных мной решений. Пожалуйста, встань.
9

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

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

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

в конце файла .bash_profile.

  • 0
    Если я правильно понимаю, это будет экспортировать переменную только для сеансов Python, запущенных через терминал, верно?
  • 0
    @jxramos - да!
9

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

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

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

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

Добавление выше к моему ~/.bashrc помогло на Ubuntu 16.04

  • 0
    Я сделал echo PYTHONPATH и ничего не echo PYTHONPATH ! это означает, что этот PYTHONPATH не был инициализирован, поэтому я просто вставляю эту строку export PYTHONPATH=$PYTHONPATH:<PATH_TO_TF>/TensorFlow/models/research/object_detection в моем файле ~/.bashrc и в source ~/.bashrc файле source ~/.bashrc . Позже, когда я сделал `echo $ PYTHONPATH`, он дал мне :<PATH_TO_TF>/TensorFlow/models/research/object_detection , Есть ли какие-либо предложения о том, что я сделал что-то не так?
  • 0
    export PYTHONPATH=<PATH_TO_TF>/TensorFlow/models/research/object_detection , когда вы экспортируете PYTHONPATH в первый раз, вы должны сделать это без ${PYTHONPATH}: часть
Показать ещё 1 комментарий
5

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

  • 0
    Добавьте в .bash_profile если вы используете оболочку входа, в противном случае используйте .profile
1

В MacOS вместо указания пути к определенной библиотеке. Предоставление полного пути к корневой папке проекта в

~./bash_profile 

сделал мой день, например:

export PYTHONPATH="${PYTHONPATH}:/Users/<myuser>/project_root_folder_path"

после этого сделайте:

source ~./bash_profile
1

Добавление нового пути к PYTHONPATH выполняется вручную:

добавив путь к вашему профилю ~/.bashrc в терминале:

vim ~/.bashrc

вставьте следующее в свой профиль

export PYTHONPATH="${PYTHONPATH}:/User/johndoe/pythonModule"

затем убедитесь, что ваш исходный профиль bashrc используется при запуске кода в терминале:

source ~/.bashrc 

Надеюсь это поможет.

0

Скрипт ниже работает на всех платформах, как чистый Python. Он использует Pathlib Path, зарегистрированный здесь 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))
0

В Python 3.6.4 вы можете сохранять sys.path в сеансах 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, иначе вы будете загромождать свой путь

0

Я постоянно добавляюсь в Windows Vista, Python 3.5

Системa > Панель управления > Расширенные системные настройки > Дополнительно (нажмите) Переменные среды > Системные переменные > (если вы не видите столбец PYTHONPATH в столбце Variable) (щелкните) New > Имя переменной: PYTHONPATH > Значение переменной:

Пожалуйста, напишите каталог в переменной Variable. Это подробности ответа Blue Peppers.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню