TL;DR:调用 site.addsitedir 来处理 .pth 文件
我不确定 OS X,但 PYTHONPATH 和站点包实际上在增加 sys.path 方面是独立的。
Try this:
set PYTHONPATH somehow (OS dependent)
python -c "import sys; print '\n'.join(sys.path); print sys.exec_prefix; print sys.prefix"
python -S -c "import sys; print '\n'.join(sys.path);print sys.exec_prefix; print sys.prefix"
在我的 linux 机器上,PYTHONPATH 两次都是输出的一部分——即使第二次运行中的 -S 开关跳过了导入站点模块。
现在,site.module 所做的实际上是采用 (sys.exec_prefix, sys.prefix) 和操作系统相关前缀的组合(对于 linux:lib/python2.7/dist-packages),检查任何组合是否是现有目录,如果是这样处理它(包括解析 .pth 文件)
代码在 site.py 模块 - getsitepackages() 中。
def getsitepackages():
"""Returns a list containing all global site-packages directories
(and possibly site-python).
For each directory present in the global ``PREFIXES``, this function
will find its `site-packages` subdirectory depending on the system
environment, and will return a list of full paths.
"""
sitepackages = []
seen = set()
for prefix in PREFIXES:
if not prefix or prefix in seen:
continue
seen.add(prefix)
if sys.platform in ('os2emx', 'riscos'):
sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))
elif os.sep == '/':
sitepackages.append(os.path.join(prefix, "lib",
"python" + sys.version[:3],
"site-packages"))
sitepackages.append(os.path.join(prefix, "lib", "site-python"))
else:
sitepackages.append(prefix)
sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
(...)
该函数最终返回一个列表,并为该列表的每个元素调用 addsitedir 函数 - 在该函数中,您具有使 .pth 文件正常工作的逻辑。
长话短说 - 处理 .pth 文件 - 在您的入门级脚本中调用 site.addistedir。你也可以考虑将它放在你的 sitecustomize.py 中——只要确保你的 python 发行版还没有。