Як дізнатися шлях до python за допомогою python?


351

Як я можу дізнатись, які каталоги перелічені в PYTHONPATHзмінній моєї системи , із сценарію Python (або інтерактивної оболонки)?


24
Я не впевнений, що ви намагаєтесь зробити, але якщо ви хочете знати, які папки використовуються для пошуку імпортних модулів, не варто покладатися на них PYTHONPATH. Використовуйте sys.pathдля цього.
Вануан

Простим експериментом я знайшов відповідь Вануана нижче (друк sys.path) просто друкує PYTHONPATH. Це працює після того, як ми змінимо значення, використовуючи add_path (new_path), який додає PYTHONPATH.
Чан Кім

6
Назва цієї публікації та орган задають два різні питання. sys.pathце "Список рядків, що визначає шлях пошуку для модулів" - docs.python.org/2/library/sys.html#sys.path . PYTHONPATH - це змінна середовище, яка впливає на цей список. За будь-яким розумним визначенням sys.pathце ваш "пітон шлях".
spinkus

4
Не забувайте про це python -m site.
Ендрю Маккінлай

Відповіді:


236

sys.pathможе включати елементи, які конкретно не входять до PYTHONPATHзмінної вашого середовища. Для прямого запиту змінної використовуйте:

import os
try:
    user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
except KeyError:
    user_paths = []

3
(або, загалом кажучи, ... спліт (os.sep)). Не можу зрозуміти, чому ти не отримуєш кохання, Марк. Ваша відповідь технічно точніша за власну відповідь Пола Д Вайта на його питання ????
mjv

5
os.sep невірний, див. stackoverflow.com/questions/1499019/…
Марк Ransom

2
І ця проблема з роздільником, мабуть, тому я не отримав кохання. Дякую за те, що ви мене прямо встановили.
Марк Рансом

11
І якщо ви отримаєте KeyError, чи означає це, що PYTHONPATH не визначений у моїй системі? Це проблема? Дякую
glarrain

9
@glarrin, правильно - KeyError означає, що PYTHONPATH не визначений. Це не буде проблемою, тому що вже встановлені за замовчуванням контури, див sys.path.
Марк Рансом

601

Ви, ймовірно, хотіли б і цього:

import sys
print(sys.path)

Або як один лайнер від терміналу:

python -c "import sys; print('\n'.join(sys.path))"

Caveat : Якщо у вас встановлено кілька версій Python, ви повинні використовувати відповідну команду python2або python3.


Те саме. Linux aaa.com 2.6.18-4-686-bigmem # 1 SMP ср 6 червня 09:41:07 UTC 2007 i686 GNU / Linux ... Debian Sarge
Spechal

7
Це незалежний від платформи та довкілля спосіб отримати поточний шлях пітону виконання.
Дмитро Міньковський

13
Ця відповідь була набагато кориснішою для моєї ситуації, ніж прийнята відповідь. Я знаю, що таке мінливі середовища. Мені потрібно було знати, куди пітон вирішив вказати, крім моєї змінної середовища.
Vorticity

Для Python 3:python -c "import sys; print('\n'.join(sys.path))"
mirceamironenco

@mirceamironenco змінився
Vanuan

10

Не можу редагувати іншу відповідь. Невелика помилка в тому, що це лише Windows. Більш загальним рішенням є використання os.sep, як показано нижче:

sys.path може включати елементи, які не входять конкретно до вашої змінної середовища PYTHONPATH. Для прямого запиту змінної використовуйте:

import os
os.environ['PYTHONPATH'].split(os.pathsep)

6
Для майбутніх читачів: os.sepповертає роздільник каталогів для операційної системи, наприклад /. Розділювач, який використовується в шляху Python, відрізняється і повертається os.pathsepяк показано у прийнятій відповіді.
Пол Д. Уейт

3

PYTHONPATH - це змінна середовище, значення якої - список каталогів. Після встановлення, Python використовується для пошуку імпортованих модулів разом з іншими std. та сторонні бібліотечні каталоги, перелічені в "sys.path" Python.

Як і будь-які інші змінні середовища, ви можете експортувати його в оболонці або в ~ / .bashrc, дивіться тут . Ви можете запитати os.environ ['PYTHONPATH'] щодо його значення в Python, як показано нижче:

$ python3 -c "import os, sys; print(os.environ['PYTHONPATH']); print(sys.path) if 'PYTHONPATH' in sorted(os.environ) else print('PYTHONPATH is not defined')"

ЯКЩО визначено в оболонці як

$ export PYTHONPATH=$HOME/Documents/DjangoTutorial/mysite

ТОГО результат =>

/home/Documents/DjangoTutorial/mysite
['', '/home/Documents/DjangoTutorial/mysite', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

Результат ELSE =>

PYTHONPATH is not defined

Щоб встановити PYTHONPATH на кілька шляхів, дивіться тут .

Зауважте, що ви можете додати або видалити шлях пошуку через sys.path.insert (), del або видалити () під час виконання, але НЕ через os.environ []. Приклад:

>>> os.environ['PYTHONPATH']="$HOME/Documents/DjangoTutorial/mysite"
>>> 'PYTHONPATH' in sorted(os.environ)
True
>>> sys.path // but Not there
['', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

>>> sys.path.insert(0,os.environ['PYTHONPATH'])
>>> sys.path // It's there
['$HOME/Documents/DjangoTutorial/mysite', '', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']
>>> 

Підсумовуючи, PYTHONPATH - це один із способів визначення шляхів пошуку Python для імпортованих модулів у sys.path. Ви також можете застосувати список операцій безпосередньо до sys.path без допомоги PYTHONPATH.


0

Python повідомляє мені, де він живе, коли дає мені повідомлення про помилку :)

>>> import os
>>> os.environ['PYTHONPATH'].split(os.pathsep)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\martin\AppData\Local\Programs\Python\Python36-32\lib\os.py", line 669, in __getitem__
    raise KeyError(key) from None
KeyError: 'PYTHONPATH'
>>>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.