在Mac OS X上,Python模块搜索路径是如何确定的?

7
当导入非内置模块时,解释器会在sys.path指定的位置中搜索。 sys.path从这些位置初始化(http://docs.python.org/library/sys.html#sys.path):
  1. 包含输入脚本的目录(或当前目录)
  2. PYTHONPATH
  3. 安装相关的默认值
虽然前两个来源很简单,但有人能解释第三个是如何工作的以及有哪些影响它的可能性吗?
尽管我对一般的解决方案感兴趣,但我的具体问题是:
  • 我已经安装了Enthought distribution 7.2 32-bit,然后安装了Scipy-Superpack。现在,Enthought Python 尝试从/Library/Python/2.7/导入numpy,这是superpack安装它们的地方,而不是从Enthought site-packages导入。
  • 使用py2app -A创建的wxPython应用程序与使用python start_app.py启动应用程序时具有不同的sys.path
2个回答

3
第三个源的基础是在编译时(或者更准确地说是配置时间)设置,具体取决于平台。然后,在运行时通过 .pth 文件进行扩展和添加等操作(一旦 Python 可执行文件被编译完成,你可以通过这种方式来影响第三个源)。关于 .pth 文件的工作原理以及有关如何从构建时设置中构造 sys.path 等更多信息,请参阅 Python 文档的此页面:http://docs.python.org/library/site.html 不过我不确定为什么您要特别影响第三个源,当您可以影响整个 sys.path。无论如何,影响 sys.path 的三种方法是:(无需重新编译 Python 或修补源代码):
  1. Via the PYTHONPATH environment variable.
  2. By creating .pth files and dropping them where Python scans for packages. (See the link earlier for details.)
  3. Programmatically, by importing sys and then appending or prepending to sys.path

    import sys
    sys.path.insert(0, '/this/path/will/be/considered/first')
    
希望这三种方法中的一种能帮助您实现您想要的目标。

谢谢您的答案!我对第三个来源特别感兴趣的原因是,在某些情况下,有一些不需要的库不在 PYTHONPATH 中,会导致错误,并且我没有直接访问 sys.path 的权限,例如在构建 sphinx 文档时。 - christianbrodbeck

1
在Mac OS X 10.7.5系统上,我也遇到了一个问题,Enthought python在寻找模块时会去/Library/Python/2.7/。显然,这是由于位于/Library/Python/2.7/site-packages的easy-install.pth文件引起的。更改此文件的扩展名后,Enthought python导入了Enthought模块(来自/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages)。

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