使用.pth文件
我想在一个我没有写权限的系统上,让一个模块可以被找到,但又不想改变环境变量(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 个回答
你可以在已经在系统路径(sys.path)中的文件夹里创建一个 .pth 文件,这样它就可以被包含进来了。
根据文档的说明,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上)可能会有一个特定于站点的目录。如果你有权限写入那个目录(而不仅仅是你的脚本目录),可以试试这个方法。