Как мне узнать мой путь к Python, используя Python?

353

Как узнать, какие каталоги перечислены в PYTHONPATHпеременной моей системы , из скрипта Python (или интерактивной оболочки)?

Пол Д. Уэйт
источник
25
Я не уверен, что вы пытаетесь сделать, но если вы хотите знать, какие папки используются для поиска импортируемых модулей, вам не следует полагаться 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.
Эндрю Маккинлей

Ответы:

237

sys.pathможет включать элементы, которые не входят в PYTHONPATHпеременную среды. Чтобы запросить переменную напрямую, используйте:

import os
try:
    user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
except KeyError:
    user_paths = []
Марк Рэнсом
источник
3
(или, более обобщенно ... split (os.sep)). Не могу понять, почему ты не получаешь любовь, Марк. Ваш ответ технически более точен, чем собственный ответ Пола Уэйта на его вопрос ????
MJV
5
os.sep неверен, см. stackoverflow.com/questions/1499019/…
Марк Рэнсом
2
И эта проблема с разделителем, вероятно, почему я не получил любовь. Спасибо, что поправил меня.
Марк Рэнсом
11
И если получено KeyError, означает ли это, что PYTHONPATH не определен в моей системе? Это проблема? Спасибо
Гларрейн
9
@glarrin, правильно - KeyError означает, что PYTHONPATH не определен. Это не будет проблемой, потому что уже установлены пути по умолчанию, смотрите sys.path.
Марк Рэнсом
602

Вы, вероятно, также хотели бы это:

import sys
print(sys.path)

Или как один вкладыш из терминала:

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

Предостережение : если у вас установлено несколько версий Python, вы должны использовать соответствующую команду python2или python3.

Vanuan
источник
Тем же. Linux aaa.com 2.6.18-4-686-bigmem # 1 SMP Ср 6 июня 09:41:07 UTC 2007 i686 GNU / Linux ... Debian Sarge
Spechal
7
Это независимый от платформы и среды способ получить путь Python текущей среды выполнения.
Дмитрий Минковский
14
Этот ответ был гораздо более полезным для моей ситуации, чем принятый ответ. Я знаю, каковы мои переменные среды. Мне нужно было знать, где Python решил указать помимо моей переменной среды.
завихрение
Для Python 3:python -c "import sys; print('\n'.join(sys.path))"
mirceamironenco
@mirceamironenco изменился
Вануан
11

Не могу отредактировать другой ответ. Имеет незначительную ошибку в том, что это только для Windows. Более общее решение - использовать os.sep, как показано ниже:

sys.path может включать элементы, которые не входят в переменную окружения PYTHONPATH. Чтобы запросить переменную напрямую, используйте:

import os
os.environ['PYTHONPATH'].split(os.pathsep)
Виталий
источник
6
Для будущих читателей: os.sepвозвращает разделитель каталогов для операционной системы, например /. Разделитель, используемый в пути Python, отличается и возвращается os.pathsepкак показано в принятом ответе.
Пол Д. Уэйт
3

PYTHONPATH - это переменная окружения, значением которой является список каталогов. После установки он используется Python для поиска импортированных модулей, наряду с другими стандартными данными. и сторонние библиотечные каталоги, перечисленные в "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']

Иначе результат =>

PYTHONPATH is not defined

Чтобы установить PYTHONPATH для нескольких путей, смотрите здесь .

Обратите внимание, что можно добавить или удалить путь поиска через sys.path.insert (), del или remove () во время выполнения, но НЕ через 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'
>>>
C4rnot
источник