python模块搜索与导入过程及原理详解

python中,每个.py文件被称之为模块,每个具有__init__.py文件的目录被称为包。只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用
如果你要使用的模块(py文件)和当前模块在同一目录,只要import相应的文件名就好,比
如在a.py中使用b.py:

import b 

详细参考https://blog.csdn.net/kcsdnprac/article/details/54839450

解决import module_name问题的各种方法集锦:https://blog.csdn.net/kcsdnprac/article/details/54839450
https://blog.csdn.net/flyfrommath/article/details/68961088

搜索路径和路径搜索

模块的导入需要叫做“路径搜索”的过程

搜索路径:查找一组目录
路径搜索:查找某个文件的操作
ImportError: No module named myModule
这种错误就是说:模块不在搜索路径里,从而导致路径搜索失败!
导入模块时,不带模块的后缀名,比如.py,直接import 模块名。

Python搜索模块的路径:搜索路径

1)、程序的主目录
2)、PTYHONPATH目录(如果已经进行了设置)
3)、标准连接库目录(一般在/usr/local/lib/python2.X/
4)、任何的.pth文件的内容(如果存在的话).新功能,允许用户把有效果的目录添加到模块搜索路径中去
.pth后缀的文本文件中一行一行的地列出目录。
这四个组建组合起来就变成了sys.path了,
https://blog.csdn.net/qw_xingzhe/article/details/52695486

当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/')

https://www.cnblogs.com/lifeofershisui/p/8135702.html
实例:
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这个文件。
参考:https://blog.csdn.net/hey_shirley/article/details/51280912

sys.path和PYTHONPATH的区别

https://blog.csdn.net/liuchunming033/article/details/45874095

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值