Как точно установлен sys.path Python2 в Windows? - PullRequest
4 голосов
/ 14 июля 2011

В документации Python говорится, что sys.path это "Инициализировано из переменной среды PYTHONPATH, плюс зависящее от установки значение по умолчанию."

Но что такое "зависящее от установки"default "точно для Windows?

(я знаю, что это, вероятно, зависит от того, как был скомпилирован python, но если все, что у меня есть, это двоичный файл, есть ли способ выяснить, как строится значение по умолчанию sys.path?)

Разъяснение : Я не спрашиваю: "Каков мой sys.path?".Я хочу знать, "как Python создает sys.path?"Документация говорит, что sys.path создан с sys.path[0], являющимся текущим каталогом скрипта, плюс все, что Python находит в переменной окружения PYTHONPATH, плюс некоторое зависящее от установки voodoo.Так что же это за таинственная часть вуду?

Ответы [ 3 ]

6 голосов
/ 15 июля 2011

Похоже на Правин Голлакота имеет хорошую информацию на Устранение неполадок в python sys.path (обновлено здесь:)

  • Первое, что добавляется C: \ WINNT \ system32 \ python27.zip (подробнее в PEP273 ).

  • Следующие добавленные из записей в реестре Windows. Записи C:\Python27\DLLs;C:\Python27\lib; C:\Python27\lib\plat-win; C:\Python27\lib\lib-tk взяты из HOT_KEY_LOCAL_USER/Python/PythonCore/2.7/PythonPath в реестре. Больше подробностей в комментариях к исходному коду Python здесь http://svn.python.org/projects/python/trunk/PC/getpathp.c (Эти записи мне было непросто понять, пока я не нашел ссылку выше).

  • Далее, как описано в документации к пакету site , sys.path составлено из sys.prefix и sys.exec_prefix. На моем компьютере они оба указывают на C:\Python27. И по умолчанию он ищет lib/site-packages в любом случае. Поэтому теперь записи C:\Python27; C:\Python27\lib\site-packages добавляются в список выше.

  • Затем выполняется поиск каждого из .pth файлов в алфавитном порядке. У меня есть easy_install.pth, pywin32.pth и setuptools.pth в моих пакетах сайта. Здесь вещи начинают становиться странными. Было бы просто, если бы записи в файлах .pth были просто каталогами. Они просто добавляются к sys.path строка за строкой. Однако easy_install.pth имеет некоторый код Python, который заставляет записи, перечисленные в easy_install.pth, добавлять список пакетов в начале списка sys.path.

  • После этого записи каталога в pywin32.pth, setuptools.pth добавляются в конец списка sys.path, как и ожидалось.

Примечание. Хотя приведенное выше обсуждение относится к Windows, оно похоже даже на Mac и т. Д. На Mac он просто добавляет различные значения по умолчанию для ОС, такие как darwin и т. Д., Прежде чем начинает искать каталог site-packages для файлов .pth.

2 голосов
/ 14 июля 2011

Лучший способ - проверить фактический путь в вашем интерпретаторе Python:

$ python
Python 2.6.6 (r266:84297, Aug 24 2010, 18:13:38) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pprint, sys
>>> pprint.pprint(sys.path)
['',
 'c:\\Python26\\lib\\site-packages\\setuptools-0.6c11-py2.6.egg',
 'c:\\Python26\\lib\\site-packages\\nose-1.0.0-py2.6.egg',
 'C:\\Windows\\system32\\python26.zip',
 'c:\\Python26\\DLLs',
 'c:\\Python26\\lib',
 'c:\\Python26\\lib\\plat-win',
 'c:\\Python26\\lib\\lib-tk',
 'c:\\Python26',
 'c:\\Python26\\lib\\site-packages',
 'c:\\Python26\\lib\\site-packages\\win32',
 'c:\\Python26\\lib\\site-packages\\win32\\lib',
 'c:\\Python26\\lib\\site-packages\\Pythonwin',
 'c:\\Python26\\lib\\site-packages\\wx-2.8-msw-unicode']
1 голос
/ 14 июля 2011

Вы пытались импортировать sys и затем печатать sys.path? Похоже, что он содержит следующее в моей системе Windows 7:

'', 
'C:\\Windows\\system32\\python26.zip', 
'c:\\python26\\DLLs', 
'c:\\python26\\lib', 
'c:\\python26\\lib\\plat-win', 
'c:\\python26\\lib\\lib-tk', 
'c:\\python26', 
'c:\\python26\\lib\\site-packages', 
'c:\\python26\\lib\\site-packages\\win32', 
'c:\\python26\\lib\\site-packages\\win32\\lib', 
'c:\\python26\\lib\\site-packages\\Pythonwin', 
'c:\\python26\\lib\\site-packages\\wx-2.8-msw-unicode'

Это соответствует пакетам, которые я установил, поскольку мне никогда не требовалось устанавливать пользовательскую переменную PYTHONPATH.

...