【Python】一、Python包的模块导入

包含了 __init__.py 文件夹的称为包

一、导入模块的语法

import <>

from <> import <>,<>

from <> import * (不建议使用)

import <> as <> (别名)

目录树例子

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py

二、 Python中的相对导入和绝对导入

绝对导入
  1. 最常见的导入方式
  2. 绝对导入可以使用 import <>from <> import <> 这两种语法
  3. 从顶层包向下以. 连接
import package.subpackage1.moduleX as moduleX
from package.subpackage1 import moduleY
from subpackage2 import moduleZ
  1. 在当前模块中引入同级别的模块或者同级别的包下的模块的时候,最好把导入路径写完整
 # moduleX.py
import moduleY
# moduleA.py
import package.subpackage1.moduleX

  会在 moduleA 的视角寻找导入的moduleX中导入的moduleY
ModuleNotFoundError: No module named 'moduleY'

绝对导入的缺点
  1. 导入同一个包下的模块需要写完整的导入路径,如果层级很深,这个路径会显得很长。(路径长)
  2. 假如要改变层级较高的包名,比如顶级包,那么所有导入路径都要改。(修改不便)
相对导入
  1. 同一个包下的模块可以很方便的相互引用,.代表本层目录,..代表上层目录,以此类推。

  2. 顶层包的包名改了,包下的模块的相对导入的语句基本不用改。

  3. 相对导入只能使用 from <> import <>,在subpackage1/moduleX.py中,可以使用如下方式导入

from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
  1. 通过__package__可以查询顶包是哪个

目录树例子

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py

Python导入规则

  1. 相对导入只适用于顶级包内的模块

  在模块 moduleY 中引入 subpackage2 包下的 moduleZ 模块:

# moduleY.py
from ..subpackage2 import moduleZ

  执行文件 moduleA.py 的代码:

# moduleA.py
import subpackage1.moduleY

ValueError: attempted relative import beyond top-level package
  因为模块 moduleY 所在的顶级包是 subpackage1,而 subpackage1 包下不存在子包 subpackage2

  1. 使用了相对导入的模块文件不能作为顶层执行文件

  执行 python moduleX.py 将会引发 ModuleNotFoundError: No module named '__main__.moduleY'; '__main__' is not a package 异常。

# moduleX.py
from .moduleY import *
posted @ 2021-09-18 19:25  灰灰不吃鱼  阅读(301)  评论(0编辑  收藏  举报