使用.pth文件

64 投票
2 回答
134095 浏览
提问于 2025-04-17 17:54

我想在一个我没有写权限的系统上,让一个模块可以被找到,但又不想改变环境变量(PYTHONPATH)。我试着在我执行的脚本同一目录下放一个 .pth 文件,但似乎没有效果。例如,我创建了一个名为 extras.pth 的文件,内容如下:

N:\PythonExtras\lib\site-packages

但是,放在同一目录并运行的脚本却打印出 False

import sys
print r"N:\PythonExtras\lib\site-packages" in sys.paths

sys.path 中,我唯一有写权限的目录就是包含这个脚本的目录。有没有其他(目前不存在的)目录可以放 extras.pth,让它被识别?有没有更好的方法来解决这个问题?

我在Windows上使用的是Python 2.7。我找到的所有关于 .pth 的问题都涉及系统模块目录。

编辑:我找到了Windows的每用户安装目录,路径是 %APPDATA%\Python\Python27\site-packages。我可以把模块放在那里,它会被导入,但如果我把 .pth 文件放在那里,就没有任何效果。这真的不应该工作,还是我做错了什么?

2 个回答

-4

你可以在已经在系统路径(sys.path)中的文件夹里创建一个 .pth 文件,这样它就可以被包含进来了。

78

根据文档的说明,PTH文件只有在site-packages目录下才会被处理。更准确地说,它们会在“site目录”中被处理,而“site目录”是一个与Python安装相关的设置,和你当前的工作目录或脚本所在的目录没有关系。

如果你的脚本所在的目录在sys.path中,你可以在那个目录下创建一个sitecustomize.py文件。这个文件会在Python启动时被加载。在sitecustomize.py中,你可以这样做:

import site
site.addsitedir('/some/dir/you/want/on/the/path')

这样不仅会把那个目录添加到路径中,还会把它作为一个“site目录”来处理,这样里面的PTH文件也会被处理。这对于你想创建一个个人的类似site-packages的目录时非常方便。

如果你只需要添加一两个目录到路径中,其实可以更简单。只需创建一个小的Python库来操作sys.path,然后在你的脚本中导入这个库。可以像这样:

# makepath.py
import sys
sys.path.append('/whatever/dir/you/want')

# script.py
import makepath

补充说明:再次根据文档,在%APPDATA%\Python\PythonXY\site-packages(在Windows上)可能会有一个特定于站点的目录。如果你有权限写入那个目录(而不仅仅是你的脚本目录),可以试试这个方法。

撰写回答