Постійно додати каталог до PYTHONPATH?


324

Щоразу, коли я використовую sys.path.append, буде доданий новий каталог. Однак, як тільки я закрию python, список повернеться до попередніх (за замовчуванням?) Значень. Як мені назавжди додати каталог PYTHONPATH?

Відповіді:


135

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

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


8
Errata: роздільник на вікна буде крапкою з комою. Якщо вам потрібно змінити системні шляхи у Windows, встановлення через GUI як змінну середовища користувача може бути недостатньою, оскільки змінні користувача додаються до системних змінних. У цих випадках вам доведеться вдатися до сценарію запуску, який вносить необхідні корективи.
Натан Ернст

1
@Nathan, tx для нагадування про крапку з комою, але (якщо ви адміністратор, звичайно), ви можете встановити системну env.vars на Windows (плюс, ОП не задається питанням про те, як змінити шлях, а як додати його , тож, користувачеві 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. Опустивши ще один каталог: / Користувачі / joey / repos / specificRepo зробили свою справу. Тепер python може переходити будь-який низхідний каталог, підключений до каталогу SpeciRepo, який містить init .py!
Qiao Yi

3
це працювало для мене, але ви могли б пояснити, де знаходиться ця змінна PYTHONPATH? і як "експортувати 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, але, здається, це не працює для мене
Lorcan O'Neill

4
Я просто символізував цей каталог до власного каталогу бібліотеки і зберігав там усі мої сценарії. Працював чудово.
firesofmay

Вирішив спробувати її знову, знайшовши цю тему ще раз, і встиг змусити її працювати як вище цього разу! Запрошені вибачення та подяки :)
Лоркан О'Нілл

Це працює просто відмінно, я був на правильному шляху , але python -m site --user-siteі (create the directory if it doesn't exist)частини були то , що мені не вистачає , щоб отримати його роботу.
Aurélien Ooms

1
Чи потрібно мені зробити додатковий крок, щоб пітон розпізнав доданий шлях до somelib.pth? Якщо ні, будь-які здогадки, чому це може не працювати?
Miladiouss

38

Це працює в Windows

  1. У Windows із програмою Python 2.7 перейдіть до папки налаштування Python.
  2. Відкрийте пакети Lib / site-пакети.
  3. Додайте в цю папку example.pth порожній файл.
  4. Додайте потрібний шлях до файлу, по одному в кожному рядку.

Тоді ви зможете побачити всі модулі в межах цих шляхів зі своїх сценаріїв.


3
ІМО, це найкраще рішення, оскільки це не залежить від вибору оболонки чи робочого середовища. Працює і в Linux, де за замовчуванням python шлях є "/usr/local/lib/pythonX.Y/site-packages". Якщо це не працює, спробуйте помістити свій .pth файл у каталог dist-пакетів.
матус

1
Windows 7, Python 3.6.5. Це відповідь. Як писав auserdude: Створіть "example.pth" у папці Lib / site-пакети Python, а потім додайте свій шлях так: C: \ somefolder \ anotherfolder \ targetfolder
JayJay123

відмінна відповідь, також працює з python 3.7 для Windows 10, мій шлях до windows 10: "C: \ Користувачі \ {usrName} \ AppData \ Локальні \ Програми \ 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, або через панель керування -> System -> вкладка Advanced -> Змінні середовища у Windows.


40
sys.path.append ('/ шлях / до / 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файлах конфігурації, які містять конкретні додаткові шляхи пошуку. Наприклад, проста установка підтримує свою колекцію встановлених пакетів, які додаються до конкретного системного файлу, наприклад, на 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будь-яку пропозицію щодо того, чи зробив я щось не так?
Ану

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. будь-які пропозиції щодо цього, як це виправити?
Ану

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"

то переконайтеся, що ви коли-небудь запускаєте свій код у терміналі:

source ~/.bashrc 

Сподіваюсь, це допомагає.


2

Я додав постійно в Windows Vista, Python 3.5

Система> Панель управління> Розширені налаштування системи> Розширені (торкніться) Змінні середовища> Системні змінні> (якщо ви не бачите PYTHONPATH у стовпці "Змінна") (натисніть) Нове> Назва змінної: PYTHONPATH> Значення змінної:

Будь ласка, напишіть каталог у значенні Змінна. Це деталі відповіді Блакитного перцю.


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.