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


324

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

Ответы:


135

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

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


8
Ошибка: разделитель на окнах будет точка с запятой. Если вам необходимо переопределить системные пути в окнах, настройка через графический интерфейс пользователя в качестве переменной среды пользователя может быть недостаточной, так как переменные пользователя добавляются к системным переменным. В этих случаях вам нужно прибегнуть к сценарию запуска, который вносит необходимые изменения.
Натан Эрнст

1
@Nathan, tx для напоминания о точке с запятой, но (если вы, конечно, администратор) вы можете установить системный env.vars для окон (плюс, OP не спрашивает, как переопределить путь, а только как добавить к нему) Таким образом, пользователь env.var также подойдет для этого! -).
Алекс Мартелли

К сожалению, я не являюсь администратором на своем рабочем ПК, поэтому мне приходится прибегать к таким мерам. :(
Натан Эрнст

439

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

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

28
Это прекрасно сработало для меня, но убедитесь, что каталог, на который вы указываете, имеет самый верхний файл init .py в вашей структуре каталогов. Сначала это было не совсем понятно для меня. Например, я попытался экспортировать PYTHONPATH = $ PYTHONPATH: / Users / joey / repos, но это не сработало, потому что в моем каталоге repos не было _ init_ .py. Идем дальше на один каталог: / Users / joey / repos / specificRepo сделали свое дело. Теперь python может проходить через любой нисходящий каталог, связанный с каталогом specificRepo, который содержит init .py!
Цяо И

3
это сработало для меня, но не могли бы вы объяснить, где находится эта переменная PYTHONPATH? и как "export PYTHONPATH" узнает, где находится этот файл?
AppleLover

42
помните, что после редактирования, ~/.bashrcзатем запустите source ~/.bashrcсм. stackoverflow.com/questions/2518127/…
b_dev

2
Я думаю, что это плохая идея помещать sudo suв начало вашего файла .bashrc. Этот пост со мной согласен. По крайней мере, в моей системе это даже не нужно.
LondonRob

Это ответ.
Аэрин

88

Вместо манипулирования 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"

Я попробовал это, используя Python 2.6, и это, похоже, не работает для меня
Лоркан О'Нил

4
Я просто поставил ссылку на этот каталог в свой каталог библиотеки и сохранил там все свои скрипты. Работал нормально.
firesofmay

Решил попробовать это снова после нахождения этой темы снова и сумел заставить это работать как выше в этот раз! Признанные и сокрушенные извинения :)
Lorcan O'Neill

Это работает просто отлично, я был на правильном пути, но мне не хватало python -m site --user-siteи (create the directory if it doesn't exist)частей, чтобы заставить его работать.
Aurélien Ooms

1
Нужно ли делать дополнительный шаг, чтобы python распознал добавленный путь к somelib.pth? Если нет, то угадайте, почему это может не сработать?
Миладиусс

38

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

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

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


3
ИМО, это лучшее решение, так как оно не зависит от выбора оболочки или рабочей среды. Работает и в Linux, где путь к Python по умолчанию - "/usr/local/lib/pythonX.Y/site-packages". Если это не сработает, попробуйте поместить ваш файл .pth в каталог dist-packages.
Матус

1
Windows 7, Python 3.6.5. Это ответ. Как писал auserdude: создайте файл «example.pth» в папке Python lib / site-packages, а затем добавьте свой путь следующим образом: C: \ somefolder \ anotherfolder \ targetfolder
JayJay123

отличный ответ, также работает с Python 3.7 на Windows 10, мой путь к Windows 10: «C: \ Users \ {usrName} \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib»
Ali80

Может подтвердить, что он работает для Python 3.6.7 в Windows 10. Однако обратите внимание, что путь добавляется к вашей PYTHONPATH, что означает, что ваш добавленный модуль не будет найден в случае конфликта имен.
BramAppel

25

Если кто-то все еще смущен - если вы работаете на Mac, сделайте следующее:

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

2
Любой, кто интересуется, как увидеть путь питона, использует: какой питон
Ариндам Ройховдхури

почти уверен, что вам нужно перезагрузить терминал
пользователь

на самом деле exportключ был то, что мне не хватало !!!!, голосовал, спасибо большое!
a_m_dev

21

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

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

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


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

15

Чтобы дать немного больше объяснений, 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 /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/а затем системный питон добавит этот путь поиска.


10

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

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

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

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


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

1
@jxramos - да!
Питер Пайпер

9

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

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

7

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

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

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


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

export PYTHONPATH=<PATH_TO_TF>/TensorFlow/models/research/object_detection, когда вы экспортируете PYTHONPATH в первый раз, вы должны сделать это без ${PYTHONPATH}:детали
boyangeor

Спасибо, но всякий раз, когда я перезагружаю свой компьютер, путь python сбрасывается на тот, который я установил 1-м, т.е. :<PATH_TO_TF>/TensorFlow/models/research/object_detectionудаляет 2-й export PYTHONPATH=$PYTHONPATH:/TensorFlow/models/research/slim. какие-либо предложения по этому вопросу, как это исправить?
Anu

7

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

~/.bash_profile 

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

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

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

source ~/.bash_profile

6

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


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

3

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

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

vim ~/.bashrc

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

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

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

source ~/.bashrc 

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


2

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

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

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


1

Сценарий ниже работает на всех платформах, так как это чистый 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))

1

Это обновление этой ветки, в котором есть несколько старых ответов.

Для тех, кто использует MAC-OS Catalina или более новую версию (> = 10.15), был введен новый терминал с именем zsh (заменяющий старый bash).

У меня были некоторые проблемы с ответами выше из-за этого изменения, и я несколько сделал обходной путь, создав файл ~/.zshrc и вставив каталог файла в $PATHи$PYTHONPATH

Итак, сначала я сделал:

nano ~/.zshrc

Когда редактор открылся, я вставил следующий контент:

export PATH="${PATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"
export PYTHONPATH="${PYTHONPATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"

сохранил его и перезапустил терминал.

ВАЖНО: путь выше указан для пути моего компьютера, вам придется адаптировать его к вашему питону.


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, иначе вы будете загромождать свой путь


-3

Кратчайший путь между A <-> B - это прямая линия;

import sys
if not 'NEW_PATH' in sys.path:
  sys.path += ['NEW_PATH']
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.