python中,每个.py文件被称之为模块,每个具有__init__.py
文件的目录被称为包。只要模块或者包所在的目录在sys.path
中,就可以使用import 模块或import 包来使用
如果你要使用的模块(py文件)和当前模块在同一目录,只要import相应的文件名就好,比
如在a.py中使用b.py:
import b
详细参考:
解决import module_name问题的各种方法集锦:
搜索路径和路径搜索
模块的导入需要叫做“路径搜索”的过程
搜索路径:查找一组目录
路径搜索:查找某个文件的操作 ImportError: No module named myModule
这种错误就是说:模块不在搜索路径里,从而导致路径搜索失败!
导入模块时,不带模块的后缀名,比如.py,直接import 模块名。
Python搜索模块的路径:搜索路径
1)、程序的主目录
2)、PTYHONPATH
目录(如果已经进行了设置)
3)、标准连接库目录(一般在/usr/local/lib/python2.X/
)
4)、任何的.pth文件的内容(如果存在的话).新功能,允许用户把有效果的目录添加到模块搜索路径中去
.pth后缀的文本文件中一行一行的地列出目录。
这四个组建组合起来就变成了sys.path了,
当python import模块的时候,就通过sys.path
里面的目录列表下面去查找。 sys.path
是python的搜索模块的路径集,是一个list。
查看sys.path
方法:
import sys,pprint
pprint.pprint(sys.path)
or
import os
print os.sys.path
or
import sys
sys.path
一般会得到类似如下结果:
>>> import sys
>>> sys.path
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu',
'/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat',
'/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7',
'/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
可以看到,路径列表的第一个元素为空字符串,代表的是相对路径下的当前目录.
由于在导入模块的时候,解释器会按照列表的顺序搜索,直到找到第一个模块,所以优先导入的模块为同一目录下的模块.
导入模块时搜索路径的顺序也可以改变.这里分两种情况:
1,通过sys.path.append(),sys.path.insert()
等方法来改变,这种方法当重新启动解释器的时候,原来的设置会失效.
2,改变PYTHONPATH
,这种设置方法永久有效:
在这种情况下,可以通过在sys.path列表显示的路径中添加.pth文件来实现
1)在系统的环境变量中设置的PYTHONPATH
,是永久的。
2)命令行中设置的PYTHONPATH
,在命令行窗口关闭后,就是失效了。
如:
export PYTHONPATH=$PYTHONPATH:/home/zhanghm
注意:此方法只在当前命令窗口生效,即如果打开一个新的Terminal 窗口,定位到当前目录, 打印PYTHONPATH
是没有刚才加入的路径的.
3)在python中添加
import sys
sys.path.append('/home/zhanghm/')
实例:
Tensorflow 的 object detection API 模块中安装教程中
export PYTHONPATH=$PYTHONPATH:`pwd`:'pwd'/slim
即添加了python 路径:(pwd 是输出当前目录的命令,这里为什么可以这样,还不懂)添加了两个路径,分别为 /home/.../models-master/research
和/home/.../models-master/research/slim
(可以验证在research 文件夹下有slim 文件)
Tensorflow 的object detection API 模块中object_detection_tutorial.ipynb
中
sys.path.append("..")
即在python 中添加了新的搜索目录,即当前目录的上一层(在这里应该是/home/…/models-master/research)
如果我们有某个python文件夹(比如是自己写的一些python模块),它的路径是~/python
,如果我们想在其他地方导入其中的模块,我们就修改home下的.profile
文件
gedit ~/.profile
在文件的最后一行输入添加以下代码
export PYTHONPATH=$PYTHONPATH:~/python
这样就将我们的python文件夹的路径加入到了PYTHONPATH
。
在修改完.profile
之后,我们用以下命令将文件重新加载一遍,就可以更新PYTHONPATH
了。因为是修改的是/home目录下的.profile
文件,所以这个更改只能对当前用户生效,换成其他用户就不行了。如果要所有用户都有效,可以修改/etc/bash.bashrc
,操作同方法跟此方法相同,只是修改的文件变成/etc/bash.bashrc这个文件。
参考:
sys.path和PYTHONPATH的区别