python引用外部代码的import机制

【导读】使用import导入额外代码经常报错?看完文章完美解决。

▍目录

  1. python引用外部代码的方式
  2. 绝对导入和相对导入
  3. 结尾

▍python引用代码的方式

Python中引入代码包的方式包括绝对导入和相对导入两种方式。这种导入方式可以使用importfrom...import语句来实现。在Python中,import语句会按照一定的搜索路径来查找要导入的模块。搜索路径是一个包含了多个目录的列表,可以通过sys.path变量来查看。

具体的搜索路径如下:

  1. 当前目录:即执行脚本所在的目录
  2. PYTHONPATH环境变量包含的目录
  3. 标准库安装目录下的site-packages子目录
  4. 标准库安装目录下的其他子目录

程序会按照这个顺序依次搜索要导入的模块,如果找到了就直接导入,否则会抛出ImportError异常。

▍绝对导入和相对导入

在了解 绝对导入和相对导入之前,必须了解一个概念,什么是python的主模块?

在 Python 中,主模块指的是直接被 Python 解释器执行的模块。它被用来指定程序入口,也就是程序从哪里开始执行。当一个 Python 脚本被直接执行时,该脚本就成为了主模块。当我们在一个Python脚本中直接运行该脚本时,__name__变量的值为"__main__";而当我们在其他Python脚本中导入该模块时,__name__变量的值就是该模块的名称

哪些情况必须使用绝对导入?

  1. Python的主模块在引用其它代码时都必须使用绝对导入。
  2. 主模块的同级模块引用其它文件的时候也必须使用绝对导入。

哪些情况可以使用相对导入?

  1. 相对导入只能在包中使用,并且必须显式地指定要导入的模块名称。
  2. 相对导入只能导入相对主模块下的次级目录结构下的模块代码。

相对导入语法:

.package:代表导入同级模块

..package:代表导入上层模块

...package:代表导入上上层模块

举个例子,假设我们的目录结构如下所示:

当main.py作为主模块被执行时,main.py引用fileA代码的方式有:

绝对导入:

from packA import fileA

import packA.fileA

相对导入:

在主模块中不可以使用相对导入的方式


当main.py作为主模块被执行时,fileB1引用fileA中代码的方式有。

绝对导入:

from packB import fileA

import packB.fileA

相对导入:

from .. import fileA

import ..fileA


当main.py作为主模块执行时,fileB1引入fileB2中代码的方式有。

绝对导入:

from packB import fileB2

相对导入:

from . import fileB2

import .fileB2


当fileB1.py作为主模块执行时,fileB1引入fileA中代码的方式有:

绝对导入:

from packA import fileA

相对导入:

在主模块中不可以使用相对导入的方式

▍结尾

关注慕课python,实时掌握精彩文章推送,文章中有任何问题欢迎评论区讨论交流。

相关文章

Python动态导入核心解析:按需加载模块的工程实践方案

喜欢的条友记得关注、点赞、转发、收藏,你们的支持就是我最大的动力源泉。根据Python官方性能测试,动态导入机制可使大型应用启动时间缩短35%-68%。本文通过6个生产案例,解析importlib模块...

python之包与模块

包的定义包:就是文件夹,包中还可以有包,即子文件夹,__init__.py是每一个python包必须存在的文件模块:一个个的python文件就是模块包----> 模块 ----> 函数包的...

7行代码,彻底告别python第三方包import导入问题!

最近有不少小伙伴咨询小叮当关于pyton第三方包导入的问题,今天我们就来聊聊第三方包导入那些事。随着对python学习的渐入臻境,越来越多的小伙伴们开始导入自己所需的第三方包,实现各种各样的功能。但是...

Python异常模块和包

异常当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”, 也就是我们常说的BUG例如:以`r`方式打开一个不存在的文件。f = open('...

详解python包中的__init__.py

详解python包中的__init__.py1、 包与模块,类,函数之间的关系随着互联网和IOT的发展,我们在享受软件的强大和智能的同时,其背后与之对应的代码规模也越来越大。因此我们无法将所有的功能代...