Python sys.path故障排除

14

Python文档位于http://docs.python.org/library/sys.html,它指出sys.path是...

从环境变量PYTHONPATH和一个安装相关的默认值初始化。

我在我的sys.path中发现了一个路径项,导致问题,并且很难追踪它。我在Google上找到的只有人们解释如何将项目添加到PYTHONPATH变量中的信息。

我的问题是:是否有任何工具可以帮助跟踪查找特定项为什么存在于您的sys.path中?我怎样才能了解更多关于“安装相关的默认值”的信息呢?

到目前为止,我发现部分答案是对python本身使用strace并查找.pth文件。我还找到了一个sys.path_importer_cache,但可能不适用。


1
问题中的项只是我自己的软件包,我在作为root用户上使用了“setup.py develop”命令(我真该反省)。操作系统是Ubuntu Linux,但Python是一个跨平台的语言,所以我更希望能够找到文档、一般指南或者是链接到CPython源代码的内容,而不是文件/目录列表。 - Mu Mind
顺便说一下,我已经找到了我的具体问题,大多数时候只是为了记录。 - Mu Mind
1个回答

5
我最近遇到了一些关于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.prefixsys.exec_prefix构建的。在我的计算机上,它们都指向C:\Python27。默认情况下,它也会搜索lib/site-packages。因此现在将条目C:\Python27; C:\Python27\lib\site-packages添加到以上列表中。

  • 接下来,它按字母顺序搜索每个.pth文件。我在我的site-packages中有easy_install.pthpywin32.pthsetuptools.pth。这是事情开始变得奇怪的地方。如果.pth文件中的条目只是目录位置,那么它们将逐行添加到sys.path中。然而,easy_install.pth中有一些Python代码,导致列在easy_install.pth中的条目将在开头添加到sys.path列表中。

  • 在此之后,pywin32.pthsetuptools.pth中的目录条目将按预期添加到sys.path列表的末尾。

注意:虽然上述讨论涉及Windows,但在Mac等上也是类似的。在Mac上,它只会在开始查看site-packages目录中的.pth文件之前添加不同的OS默认值,如darwin等。

在您的情况下,您可以开始启动一个python shell并检查sys.prefixsys.exec_prefix指向何处,然后从那里进一步深入。

注意2:如果您使用Aptana/PyDev等IDE,则会添加更多自己的配置。因此,您需要谨慎处理。


感谢提供链接。我在Mac或Linux中找不到getpathp.c的类似物。有吗? - Mu Mind
谢谢。Mac 没有注册表,因此找到正确的位置并不像使用注册表键那样直截了当。此外,Mac 的位置将取决于制作安装程序时使用的构建选项。顺便说一句,这是关于 Mac 的最佳链接。http://svn.python.org/projects/python/trunk/Mac/README。我在我的 Mac 上检查过了,Python 2.7 确实安装在该文件中提到的位置。 - Praveen Gollakota

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接