Python 模块搜索路径

Import

下面 import 语句将创建一个名为 sys 的命名空间,sys 模块中的代码将在这个命名空间中运行

同时,这个解释器作为调用者也获得了一个名称,刚好也叫 sys,是 sys 模块一个引用,这个名称可通过 sys 修饰符来修改,如 import sys as p

>>> import sys
>>> sys.prefix
'/usr'

PYTHONPATH

一般安装好 Python 后,常用的模块已经可以直接使用,不需要设置这个环境变量。

不过,它还是会被 Python 解释器用来寻找从哪里加载模块。所以,如果想让你的模块可以被解释器找到,可以把模块所在路径加入 PYTHONPATH。

模块搜索路径

sys.path 中的文件和目录将被作为模块搜索路径并按顺序搜索:

>>> import sys
>>> from pprint import pprint as pp
>>> pp(sys.path)
['',
 '/usr/lib64/python2.7',
 '/home/apache/diary',
 '/usr/lib64/python27.zip',
 '/usr/lib64/python2.7/plat-linux2',
 '/usr/lib64/python2.7/lib-tk',
 '/usr/lib64/python2.7/lib-old',
 '/usr/lib64/python2.7/lib-dynload',
 '/usr/lib64/python2.7/site-packages',
 '/usr/lib64/python2.7/site-packages/gtk-2.0',
 '/usr/lib/python2.7/site-packages',
 '/usr/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg-info']
>>> 

sys.path 可通过修改 PYTHONPATH  来更改:

# unset PYTHONPATH
# python
>>> import sys
>>> from pprint import pprint as pp
>>> pp(sys.path)
['',
 '/usr/lib64/python27.zip',
 '/usr/lib64/python2.7',
 '/usr/lib64/python2.7/plat-linux2',
 '/usr/lib64/python2.7/lib-tk',
 '/usr/lib64/python2.7/lib-old',
 '/usr/lib64/python2.7/lib-dynload',
 '/usr/lib64/python2.7/site-packages',
 '/usr/lib64/python2.7/site-packages/gtk-2.0',
 '/usr/lib/python2.7/site-packages',
 '/usr/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg-info']
>>> 
>>> 
# export PYTHONPATH=$PHTHONPATH:/tmp/py2
# python
>>> 
>>> import sys
>>> from pprint import pprint as pp
>>> pp(sys.path)
['',
 '/tmp/py2',
 '/usr/lib64/python27.zip',
 '/usr/lib64/python2.7',
 '/usr/lib64/python2.7/plat-linux2',
 '/usr/lib64/python2.7/lib-tk',
 '/usr/lib64/python2.7/lib-old',
 '/usr/lib64/python2.7/lib-dynload',
 '/usr/lib64/python2.7/site-packages',
 '/usr/lib64/python2.7/site-packages/gtk-2.0',
 '/usr/lib/python2.7/site-packages',
 '/usr/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg-info']
>>> 

另外,在加载模块时,还要考虑一个方面: 相对导入(relative imports),就类似文件系统的相对路径了,可参考  这里

.pth 文件

通过修改 PYTHONPATH 来指定模块搜索路径时,将改变所有 python 应用的搜索路径,因为启动 python 时,它会读取这个变量,甚至不同版本的 Python 都会受影响。

除了修改PYTHONPATH 和 在代码中动态修改 sys.path,一个折中方案就是在合适的地方创建一个 .pth 文件,声明需要加入到 sys.path 的路径即可,

Pyhthon 启动时会自动读取。在 .pth 文件中还可以添加其他语句,如 import 。

site-packages 目录

有了 .pth 文件,然后就要把它放在合适的地方,这就是 site-packages 目录。来看看它的构成:

>>> import site
>>> site.PREFIXES
['/usr', '/usr']

获取了两个路径: "/usr",把它和路径 "lib/pythonX.Y/site-packages" 拼接起来,就构成了 site-packages 目录,这个目录就是有效的放置 .pth 文件的地方

你可以这样查看自己的 site-packages 目录:

>>> site.getsitepackages()
['/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages', '/usr/lib/site-python']

你可以把 .pth 文件放到上面三个目录中任意一个目录下,如我在 /usr/lib/python2.7/site-packages 下放一个文件 a.pth:

# cat /usr/lib/python2.7/site-packages/a.pth 
/tmp/py3
/tmp/nosn
# python
>>> import sys
>>> from pprint import pprint as pp
>>> pp(sys.path)
['',
 '/usr/lib64/python27.zip',
 '/usr/lib64/python2.7',
 '/usr/lib64/python2.7/plat-linux2',
 '/usr/lib64/python2.7/lib-tk',
 '/usr/lib64/python2.7/lib-old',
 '/usr/lib64/python2.7/lib-dynload',
 '/usr/lib64/python2.7/site-packages',
 '/usr/lib64/python2.7/site-packages/gtk-2.0',
 '/usr/lib/python2.7/site-packages',
 '/tmp/py3',
 '/usr/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg-info']
>>> 

其中 /tmp/nosn 目录不存在,那么它不会被加入 sys.path

上面  site.getsitepackages() 列出了所有的 site-packages  目录,可能还会外加上 site-python 目录 (and possibly site-python),这个目录还不一定存在。

将  .pth 文件放在上面哪个目录下都可以,如果目录不存在可以手动创建,然后将 .pth 文件丢进去也是有效的,比如 '/usr/lib/site-python'。

想要更好地管理 Python 环境,可以考虑这个工具 virtualenv



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值