简述
由于某些原因,在使用 import
时,Python 找不到相应的模块。这时,解释器就会发牢骚 - ImportError
。
那么,Python 如何知道在哪里搜索模块的路径呢?
版权所有:一去丶二三里,转载请注明出处:http://blog.csdn.net/liang19890820
模块搜索路径
当导入名为 hello
的模块时,解释器首先搜索具有该名称的内置模块。如果没有找到,将在变量 sys.path
给出的目录列表中搜索名为 hello.py
的文件。
sys.path
从这些位置初始化:
- 包含输入脚本的目录(或当前目录,当没有指定文件时)
-
PYTHONPATH
(目录名列表,与 shell 变量PATH
语法相同) - 与安装相关的默认值
>>> import sys
>>> sys.path
['', '/usr/local/lib/python35.zip', '/usr/local/lib/python3.5', '/usr/local/lib/python3.5/plat-linux', '/usr/local/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/site-packages']
注意: ''
表示当前目录(当前脚本所在的路径)
例如,在 /home/wang/workspace
中创建一个名为 hello.py
的模块,内容如下:
print('Hello')
然后,试图加载该模块:
>>> import os
>>>
>>> os.getcwd() # 获取当前目录
'/home/wang'
>>>
>>> import hello.py
...
ImportError: No module named 'hello'
很遗憾,由于 sys.path
中没有包含 /home/wang/workspace
这个路径,所以找不到 hello
模块,从而引发 ImportError
。
添加模块搜索路径
为了解决上述问题,需要添加模块搜索路径,可以使用以下几种方式:
动态增加路径
临时生效,对于不经常使用的模块,这通常是最好的方式,因为不必用所有次要模块的路径来污染PYTHONPATH
。修改
PYTHONPATH
变量
永久生效,对于在许多程序中都使用的模块,可以采用这种方式。这将改变所有 Python 应用的搜索路径,因为启动 Python 时,它会读取这个变量,甚至不同版本的 Python 都会受影响。增加
.pth
文件
永久生效,这是最简单的、也是推荐的方式。Python 在遍历已知的库文件目录过程中,如果遇到.pth
文件,便会将其中的路径加入到sys.path
中,于是.pth
中所指定的路径就可以被 Python 运行环境找到了。
动态增加路径
通过 sys
模块的 append()
方法在 Python
环境中增加搜索路径:
>>> import sys
>>> sys.path.append('/home/wang/workspace')
现在,查看搜索路径:
>>> sys.path
['', '/usr/local/lib/python35.zip', '/usr/local/lib/python3.5', '/usr/local/lib/python3.5/plat-linux', '/usr/local/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/site-packages', '/home/wang/workspace']
>>>
>>> import hello
Hello
可以看到,路径被成功添加进去了,再次执行导入可以正常使用。
修改 PYTHONPATH 变量
打开并编辑 bashrc
:
$ vim ~/.bashrc
将以下内容附加到文件末尾:
export PYTHONPATH=$PYTHONPATH:/home/wang/workspace
不要忘记重新加载 shell,方法是退出并重新启动,或者在命令行重新加载配置文件:
$ source ~/.bashrc # 或者 . ~/.bashrc
增加 .pth 文件
在 /usr/local/lib/python3.5/site-packages
下添加一个扩展名为 .pth
的配置文件(例如:extras.pth
),内容为要添加的路径:
/home/wang/workspace