Проблемы с sys.path() и PYTHONPATH
Я изучаю Python, я работаю в 2.7.3, и я пытаюсь понять, import
заявления.
В документации сказано, что когда вы пытаетесь импортировать модуль, интерпретатор сначала ищет один из встроенных модулей.
Что подразумевается под встроенным модулем?
Затем в документации говорится, что интерпретатор выполняет поиск в каталогах, перечисленных sys.path, и что sys.path инициализируется из следующих источников:
- каталог, содержащий входной скрипт (или текущий каталог).
PYTHONPATH
(список имен каталогов с тем же синтаксисом, что и у переменной оболочкиPATH
).- зависящее от установки значение по умолчанию.
Вот пример вывода команды sys.path с моего компьютера с использованием python в режиме командной строки: (я удалил несколько, чтобы они не были большими)
['', '/usr/lib/python2.7', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']
Теперь я предполагаю, что путь '' относится к каталогу, содержащему 'скрипт', и поэтому я подумал, что остальные из них будут исходить из моего
PYTHONPATH
переменная среды Тем не менее, когда я иду в терминал и введитеenv
,PYTHONPATH
не существует в качестве переменной среды. Я тоже пробовалimport os
затемos.environ
, но я получаю тот же вывод.У меня действительно нет переменной среды PYTHONPATH? Я не верю, что когда-либо конкретно определял переменную среды PYTHONPATH, но я предполагал, что при установке новых пакетов они автоматически изменяли эту переменную среды. Если у меня нет PYTHONPATH, как мой sys.path заполняется? Если я загружаю новые пакеты, как Python узнает, где их искать, если у меня нет этой переменной PYTHONPATH?
Как работают переменные среды? Из того, что я понимаю, переменные среды специфичны для процесса, для которого они установлены, однако, если я открою несколько окон терминала и запускаю
env
все они отображают количество одинаковых переменных, например,PATH
, Я знаю там расположение файлов для постоянных переменных среды, например/etc/environment
, который содержит мойPATH
переменная. Можно ли сказать, где хранится постоянная переменная среды? Каково рекомендуемое место для хранения новых постоянных переменных среды? Как переменные среды на самом деле работают, скажем, с интерпретатором Python? Интерпретатор Python ищетPYTHONPATH
, но как это работает на уровне сложности?
3 ответа
Так много вопросов за один раз!:)
Ну, я стараюсь ответить только на некоторые из них.
1) встроенный модуль - это любой модуль, который поставляется с выпуском Python. Например, модули sys и os являются встроенными модулями. Это действительно так.
2) Переменная PYTHONPATH не существует по умолчанию в вашей системе. Когда вы запускаете интерпретатор python, он заполняет массив пути, по которому он ищет модули, как вы описали. Это результат sys.path. Однако sys.path не является переменной окружения PYTHONPATH. Если вы установите PYTHONPATH в вашей системе, то весь путь, содержащийся в нем, будет включен в массив, который интерпретатор python использует для поиска модулей.
Я оставлю ответ на переменные окружения для других, так как не чувствую, что мне нужно отвечать на такой вопрос. Однако я чувствую, что это может измениться от системы к системе. Тем не мение...
Надеюсь, поможет.
Встроенные модули - это модули, перечисленные в
sys.builtin_module_names
, Эти модули скомпилированы вместе с интерпретатором и, следовательно,всегда доступны. Обратите внимание, что они являются частью стандартной библиотеки, но стандартная библиотека включает в себя гораздо больше модулей. Чтобы было понятно, если вы попытаетесь запустить этот код в python3.3:>>> import sys >>> sys.path = [] >>> import os # works >>> import traceback # ImportError, traceback is in the stdlib!
На python2 оба успешно, потому что
import
особые случаи - стандартный путь к библиотеке. (См. Это для получения дополнительной информации об изменениях вimport
в python3.3).Если
PYTHONPATH
не найден, то он не содержит никаких дополнительных каталогов. Однако в документации, на которую вы ссылаетесь, также говорится, что python использует "зависимое от установки значение по умолчанию". Каталоги, которые вы видите в своемsys.path
определены в этом "зависящем от установки по умолчанию". Если вы определитеPYTHONPATH
Вы можете добавить другие каталоги вsys.path
до того,как по умолчанию, но без его определения не будет никакого вреда.Переменные среды определяются для каждого процесса, однако оболочки могут предоставлять собственную "область" переменных для запускаемых ими подпроцессов. Например, вы можете установить переменные среды в файлах оболочки, например
~/.bashrc
или же~/.profile
,Если вы используете Ubuntu, предпочтительным способом определения общесистемной и постоянной переменной среды является использование
pam_enviroment
, Вы можете увидеть этот вопрос в Ask Ubuntu, который показывает, как вы можете установить общесистемную переменную среды.AFAIK Не существует стандартного способа их установки для каждого (например) дистрибутива Linux, и, очевидно, у каждой ОС есть свой метод их определения.
Если вы хотите получить более подробное объяснение о работе с переменными среды, вам, вероятно, следует обратиться к Super User.
PYTHONPATH
не определен в вашей системе. Это означает, что все, что вы видите в sys.path
кроме ''
является "зависимым от установки по умолчанию."
Переменные среды характеризуют среду, а не процесс. Однако вы можете настроить их при запуске процесса, скажем, с помощью Linux env
команда. В основном это означает, что процесс будет выполняться в другой среде. Часть "как работает" вашего вопроса может иметь платформо-зависимые ответы. Однако я не думаю, что вы можете "сказать, где хранится постоянная переменная среды", если вы имеете в виду файл. Переменные среды могут быть установлены в любом из файлов, которые выполняются в определенный момент (обычно при запуске) или просто в командной строке.