同名的python模块的加载顺序是怎样的?

遇到一个问题:

使用pip安装了easyocr这个包,我又从git上拉了easyocr的代码,因此我想在import easyocr的时候不要导入pip安装的包而是导入本地代码库中的包;

  • 要使用sys.path.insert()而不是python sys.path.append()

第一反应是将本地的路径path加到sys.path中,用的是append,发现不行,因为环境存放pakage的路径之前也在sys.path里,查找包的顺序是从前到后的,也就是说从sys.path[0]中查到的包就不会再从sys.path[1]中查找了;

打印出sys.path如下,发现“/data/anaconda3/envs/easyocr/lib/python3.8/site-packages”在里面:

['/data/EasyOCR/text_detection', '/data/anaconda3/envs/easyocr/lib/python38.zip', '/data/anaconda3/envs/easyocr/lib/python3.8', '/data/anaconda3/envs/easyocr/lib/python3.8/lib-dynload', '/data/anaconda3/envs/easyocr/lib/python3.8/site-packages', '/data/anaconda3/envs/easyocr/lib/python3.8/site-packages/ffpipe-1.1-py3.8.egg', '/data/anaconda3/envs/easyocr/lib/python3.8/site-packages/video_process_lib-1.2-py3.8.egg']

因此我们需要将本地的包路径插到“/data/anaconda3/envs/easyocr/lib/python3.8/site-packages”之前,应该用insert:

sys.path.insert(1, "/data/EasyOCR")
  • 另外值得注意的是sys.path[0],会保存运行的py文件的所在路径,也就是默认情况下,该路径的优先级最高。

Python 执行一个 py 文件,无论执行的方式是用绝对路径还是相对路径,interpreter 都会把文件所在的 directory 加入 sys.path 这个 list 中,并且是索引为 0 的位置。而并不会把执行路径加入到sys.path中哦;因此常常会出现import执行路径下的模块失败的情况

  • 还有要注意的一点是别忘了把sys.append和sys.insert放在import的前面。。

附:模块的加载顺序的相关知识

关于模块以及加载顺序的相关知识可以参考下面的文章

Python 模块的加载顺序

module

模块, 一个 py 文件或以其他文件形式存在的可被导入的就是一个模块

package

包,包含有 init 文件的文件夹

Python 解释器查找包的顺序

先默认加载sys.builtin_module_names里面的内置模块 → 再加载sys.modules中的一些标准库 → 再加载sys.path


>>> print(sys.builtin_module_names)
('_abc', '_ast', '_codecs', '_collections', '_functools', '_imp', '_io', '_locale', '_operator', '_signal', '_sre', '_stat', '_string', '_symtable', '_thread', '_tracemalloc', '_warnings', '_weakref', 'atexit', 'builtins', 'errno', 'faulthandler', 'gc', 'itertools', 'marshal', 'posix', 'pwd', 'sys', 'time', 'xxsubtype')

因此在这个顺序里,如果有同名模块,那么顺序在后面的模块就会被屏蔽;

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值