排查python sys.path问题

14 投票
1 回答
1619 浏览
提问于 2025-04-16 14:48

在Python的官方文档中,提到sys.path是...

它是从环境变量PYTHONPATH初始化的,加上一个依赖于安装的默认值。

我在我的sys.path中发现了一个路径项,它引起了一些问题,我花了很长时间才找到它。网上搜索时,我只找到一些人讲解如何添加项目到PYTHONPATH变量。

我想问的是:有没有什么工具可以帮助我查找为什么某个特定的项目会出现在我的sys.path中?我该如何了解更多关于“依赖于安装的默认值”的信息?

到目前为止,我找到的部分答案是使用strace命令来跟踪python本身,并查看.pth文件。我还发现了一个sys.path_importer_cache,但不确定这是否适用。

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 获取的。更多细节可以在这个链接中找到 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上,它会添加一些不同的操作系统默认值,比如 darwin 等,然后再开始查看 site-packages 目录中的 .pth 文件。

在你的情况下,你可以先启动一个Python命令行,检查一下 sys.prefixsys.exec_prefix 指向哪里,然后再深入了解。

注意2:如果你使用的是像Aptana/PyDev这样的IDE,它会添加更多自己的配置。所以你需要注意这一点。

撰写回答