京公网安备 11010802034615号
经营许可证编号:京B2-20210330
python中模块查找的原理与方法详解
本文主要给大家介绍了关于python模块查找的原理与方式,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍:
基础概念
module
模块, 一个 py 文件或以其他文件形式存在的可被导入的就是一个模块
package
包,包含有 __init__ 文件的文件夹
relative path
相对路径,相对于某个目录的路径
absolute path
绝对路径,全路径
路径查找
python 解释器查找被引入的包或模块
Python 解释器是如何查找包和模块的
Python 执行一个 py 文件,无论执行的方式是用绝对路径还是相对路径,interpreter 都会把文件所在的 directory 加入 sys.path 这个 list 中,Python 就是在 sys.path 中查找包和模块的,sys.path 中的内容本身又是又 Python 的环境变量决定。
code-1
执行表明相对路径和绝对路径都输出相同的结果,而且无论哪种执行方式,test.py 所在的文件夹都会被加入 sys.path 的首位,也就是索引为0的位置。
Python 解释器查找包的顺序是什么
解释器查找包,首先搜索 built-in module,其次搜索 sys.path ,这样的查找顺序将会导致同名包或模块被遮蔽。
code-2
#ls
├── os.py
├── test2.py
├── redis.py
#test2.py
import os
from redis import Redis
#execute test2.py
Traceback (most recent call last):
File "/Users/x/workspace/blog-code/p2016_05_28_python_path_find/test2.py", line 1, in <module>
from redis import Redis
ImportError: cannot import name Redis
由于 os 是 built-in module,即使在同目录下有同名模块,解释器依然可以找到正确的 os 模块,可以证实 built-in module 不会被遮蔽,而 redis 属于第三方模块,默认安装位置是 Python 环境变量中的 site-packages,解释器启动之后会将此目录中的内容加入 sys.path,由于当前目录会在 sys.path 的首位,当前目录的 redis 优先被找到,site-packages 中的 redis 模块被遮蔽了。
交互式执行环境的查找顺序
进入交互式执行环境,解释器会自动把当前目录加入 sys.path, 这时当前目录是以相对路径的形式出现在 sys.path 中:
>>> import os.path
>>> import sys
>>> os.path.abspath(sys.path[0])
'/Users/x/workspace/blog-code'
>>>
除此之外,其他与执行一个文件是相同的。
模块中的 __file__ 变量
__file__ is the pathname of the file from which the module was loaded, if it was loaded from a file. 如果一个模块是从文件加载的,__file__ 就是该模块的路径名–Python Doc:
顾名思义,当模块以文件的形式出现 __file__ 指的是模块文件的路径名,以相对路径执行 __file__ 是相对路径,以绝对路径执行 __file__ 是绝对路径。
#test3.py
print __file__
#相对路径执行
python test3.py
test3.py
#绝对路径执行
python /Users/x/workspace/blog-code/p2016_05_28_python_path_find/test3.py
/Users/x/workspace/blog-code/p2016_05_28_python_path_find/test3.py
为了保证__file__ 每次都能准确得到模块的正确位置,最好对其再取一次绝对路径 os.path.abspath(__file__) 。
交互式 shell 中的 __file__
>>> __file__
Traceback (most recent call last):
File "<input>", line 1, in <module>
NameError: name '__file__' is not defined
这是因为当前交互式shell的执行并不是以文件的形式加载,所以不存在__file__ 这样的属性。
sys.argv[0] 变量
sys.argv[0] 是它用来获取主入口执行文件。
#test.py
import sys
print __file__
print sys.argv[0]
以上 print 输出相同的结果,因为主执行文件和__file__所属的模块是同一个,当我们改变入口文件,区别就出现了。
#test.py
import sys
print __file__
print sys.argv[0]
#test2.py
import test
#execute test2.py
/Users/x/workspace/blog-code/p2016_05_28_python_path_find/child/test.py #__file__
test2.py #sys.argv[0]
总的来说,sys.argv[0] 是获得入口执行文件路径,__file__ 是获得任意模块文件的路径。
sys.modules 的作用
既然 Python 是在 sys.path 中搜索模块的,那载入的模块存放在何处?答案就是 sys.modules。模块一经载入,Python 会把这个模块加入 sys.modules 中供下次载入使用,这样可以加速模块的引入,起到缓存的作用。
>>> import sys
>>> sys.modules['tornado']
Traceback (most recent call last):
File "<input>", line 1, in <module>
KeyError: 'tornado'
>>> import tornado
>>> sys.modules['tornado']
<module 'tornado' from '/Users/x/python_dev/lib/python2.7/site-packages/tornado/__init__.pyc'>
前面说过 Python 解释器启动之后,会把预先载入 built-in module,可以通过 sys.modules 验证。
>>> sys.modules['os']
<module 'os' from '/Users/x/python_dev/lib/python2.7/os.pyc'>
>>>
借助 sys.modules 和 __file__,可以动态获取所有已加载模块目录和路径。
>>> import os
>>> os.path.realpath(sys.modules['os'].__file__)
'/Users/x/python_dev/lib/python2.7/os.pyc'
>>> import tornado
>>> os.path.realpath(sys.modules['tornado'].__file__)
'/Users/x/python_dev/lib/python2.7/site-packages/tornado/__init__.pyc'
def get_module_dir(name):
path = getattr(sys.modules[name], '__file__', None)
if not path
raise AttributeError('module %s has not attribute __file__'%name)
return os.path.dirname(os.path.abspath(path))
summary
总的来说,Python 是通过查找 sys.path 来决定包的导入,并且系统包优先级>同目录>sys.path,Python 中的特有属性 __file__ 以及 sys.argv[0] ,sys.modules 都能帮助我们理解包的查找和导入概念,只要能正确理解 sys.path 的作用和行为,理解包的查找就不是难题了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
一、RFM模型概述 RFM模型是由 George Cullinan 提出、营销领域公认的经典客户价值细分模型,依托客户交易行为数据,从三个核心维 ...
2026-10-28“不用学历可以考的资格证”这个说法,实际混着两类情况:一类是证书本身对学历没有硬性要求,报名时只看年龄、身份或培训经历; ...
2026-10-28“2025年考什么证含金量高”这个问题,很难用一张榜单回答。同一本证书,对想进会计师事务所的人有价值,对想做行政的人可能用处 ...
2026-10-2837岁考什么证,先别急着看“女生适合考什么”的榜单。这个年龄处在职业中期,优势是已有工作经验和行业理解,约束是时间精力有限 ...
2026-10-28一、卡方分布是什么 卡方分布(Chi-square Distribution,χ²分布)是统计学中一种常用的概率分布,它和正态分布、t分布一样, ...
2026-10-28职业证书的作用不能一概而论。它既不是“考了就能找到好工作”的通行证,也不是“花钱买张纸”的摆设。真正决定一张证书有多大用 ...
2026-10-28产品岗没有统一的法定准入证书,招聘时也很少把某张证书写成硬性门槛。所以“真正有用”不能看广告里的名头,而要看三件事:它对 ...
2026-10-28“一般可以考什么证书”很难给出一份通用榜单。同为“证书”,有的是法律规定的准入资格,无证不能上岗;有的是职称评聘参考;有 ...
2026-10-28“现在大学生要什么证书好”,这个问题没有统一答案。同一张证书,对想进银行的学生可能是加分项,对准备考公的学生可能完全用不 ...
2026-10-28“十大证书含金量最高”这类榜单,最大的问题不是排名不准,而是没有交代排名依据。准入类和加分类混在一起排,高壁垒的和低门槛 ...
2026-10-28“什么证容易考且有用”,这个问题本身藏着一个容易踩的坑:把“容易考”和“有用”当成两个独立打分项,各找几个高分证书拼在一 ...
2026-10-28想考一个证书,第一步不是买教材,而是先确认它属于哪一类证书、由谁发证、在哪里报名。考取证书的通用流程可以概括为六步:确定 ...
2026-10-28“女生考什么证”这个问题,网上常见的答案是“教师资格证、会计证、普通话证”,理由往往是“稳定”“适合女孩子”。这类回答的 ...
2026-10-28“女的考什么证书比较实用”这个问题,本身藏着一个容易走偏的前提:把性别当成筛选证书的依据。证书不认性别,岗位也不按性别分 ...
2026-10-28“哪些考试含金量高”这个问题,很难有一张适合所有人的总榜。同一个考试,对想进医院的人和对想做运营的人,价值完全不同。含金 ...
2026-10-28“国家认可的技能证书”日常被用得很宽:有人指职业资格,有人指职业技能等级,也有人把培训结业证、企业认证一并算入。口径不统 ...
2026-10-28工作后考市场营销证书,容易陷入两种极端:要么被“高薪就业”“行业必备”的宣传推着走,要么觉得证书都没用、不如攒经验。更实 ...
2026-10-28核心资源推荐 CDA教材(2025):https://edu.cda.cn/goods/show/3151CDA模拟题(2025):https://edu.cda.cn/goods/show/2845CD ...
2026-10-28大专学历能报的证书不少,但真正值得投入的,要先过两道筛子:第一道是“允不允许你报”,第二道是“报了对目标岗位有没有用”。 ...
2026-10-28“软考哪个证书吃香”很难一句话回答。软考全称计算机技术与软件专业技术资格(水平)考试,含初级、中级、高级多个资格。不同资 ...
2026-10-28