排查python sys.path问题
在Python的官方文档中,提到sys.path
是...
它是从环境变量PYTHONPATH初始化的,加上一个依赖于安装的默认值。
我在我的sys.path
中发现了一个路径项,它引起了一些问题,我花了很长时间才找到它。网上搜索时,我只找到一些人讲解如何添加项目到PYTHONPATH
变量。
我想问的是:有没有什么工具可以帮助我查找为什么某个特定的项目会出现在我的sys.path
中?我该如何了解更多关于“依赖于安装的默认值”的信息?
到目前为止,我找到的部分答案是使用strace
命令来跟踪python本身,并查看.pth
文件。我还发现了一个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
获取的。更多细节可以在这个链接中找到 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
文件。我在我的 site-packages 目录下有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:如果你使用的是像Aptana/PyDev这样的IDE,它会添加更多自己的配置。所以你需要注意这一点。