用 .pth 文件附加 Python 模块搜索路径

上一篇 Python 的模块搜索路径,介绍了 Python 的模块搜索路径,最终起作用的是 sys.path 路径列表。如果要自定义自己的搜索路径,就是要怎么定制 sys.path 的内容。可以简单的用 PYTHONPATH 环境变量前向添加,这儿将要说的是用 .pth 文件的方式。也可由此进一步理解 Python 依赖管理工具,像  virtualenv 等的工作原理。

.pth 文件名是什么,无所谓,Python 只认扩展名。.pth 文件中每行指定一个路径 -- 绝对或相对路径(相对于本  .pth 文件所在的目录),另外还可以空行或 # 开始的注释行,还能有 import 语句,大概只用来校验是否能导入成功,程序代码中还是需要显示的 import 模块。

.pth 文件放在哪里

.pth 文件创建好后应该放到哪里去呢?不是 sys.prefix 指示的位置,也不是 sys.path 中任意一个目录,而是  sys.path 中属于 site.packages 的某一个目录中。可以用

>>> import site
>>> site.getusersitepackages()
>>> site.getsitepackages()

查看到, 看我在  Ubuntu Linux 中看到的内容(为便于阅读,显示列表内容时进行了换行处理) 阅读全文 >>

Python 的模块搜索路径

一种语言要使用到外部库(模块) 时必然会涉及到从哪里以及按何顺序加载依赖,就像 LD_LIBRARY_PATH, CLASSPATH 那样,Python 也有其默认的模块搜索顺序, 依序找到想要的模块即停止。Python 中 sys.path 返回的列表包含了模块搜索的顺序,我们可以程序中修改该列表,或用 PYTHONPATH 环境变量前插路径,甚至是用  .pth 文件来附加路径。

简单的,可以执行命令 python3 -c "import sys; print(str(sys.path).replace(',', '\n'))" 来查看 python3 交互 shell 下的模块搜索路径,类似结果如下:

[''
'/usr/lib/python36.zip'
'/usr/lib/python3.6'
'/usr/lib/python3.6/lib-dynload'
'/home/yanbin/.local/lib/python3.6/site-packages'
'/usr/local/lib/python3.6/dist-packages'
'/usr/lib/python3/dist-packages'
'/usr/lib/python3.6/dist-packages']

注意,第一个元素是个空字符串,代表进入 python3 shell 时的当前目录。

如果在通过一个 py 脚本文件来打印 sys.path 的话显示稍微有所差异。比如在目录 /home/yanbin/Developers/ 下创建 test.py 文件,内容为 阅读全文 >>