Устранение неполадок python sys.path

Документы python на http://docs.python.org/library/sys.html говорят, что sys.path есть...

Инициализируется из переменной среды PYTHONPATH, а также зависит от установки по умолчанию.

Я нашел элемент пути в моем sys.path, который вызывал проблемы, и у него было много проблем с его отслеживанием. Все, что я мог включить в Google, это люди, объясняющие, как добавлять элементы в переменную PYTHONPATH.

Мой вопрос: есть ли какие-либо инструменты, которые могут помочь вам определить, почему конкретный элемент находится на вашем sys.path? Как узнать больше о "зависимом от установки по умолчанию"?

До сих пор я нашел частичный ответ: использовать strace на самом python и искать файлы .pth. Я также нашел a sys.path_importer_cache, который может быть или не быть применимым.

Ответы

Ответ 1

Недавно у меня были некоторые проблемы с 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.

В вашем случае вы можете начать с запуска оболочки python и проверить, где sys.prefix и sys.exec_prefix указывают, а затем сверлятся оттуда.

Примечание 2: Если вы используете среду IDE, такую ​​как Aptana/PyDev, она добавит больше собственных конфигураций. Поэтому вам нужно быть осторожным.