Python 嵌套 Package 导入与模块执行详解

小鹿同学
小鹿同学
发布时间:2026-10-15| 4人浏览过
原创

本文深入解析 Python 中嵌套 Package 的导入机制。通过示例展示如何正确导入深层模块,解释 __init__.py 的作用及 sys.modules 缓存原理。同时介绍使用 python -m 参数执行模块文件的方法,包括通过 __main__.py 简化执行流程,帮助开发者掌握复杂的包结构与模块运行方式。

Python 嵌套 Package 导入机制

承接前文关于 Python 中导入 Package 的讨论,本节进一步探讨在现有 Package 内部继续嵌套子 Package 的场景。

假设项目目录结构如下所示:

pkg1
---__init__.py
---mod1.py
------pkg2
---------__init__.py
---------mod2.py
import pkg1.pkg2.mod2

我们的目标是导入 mod2 模块。此次导入策略为先加载 pkg1,再加载 pkg2,最后导入 mod2。

import pkg1
import pkg2
import mod2

观察输出结果可以发现,mod1 并没有随着 pkg1 的导入而自动加载。

import pkg1.pkg2.mod2

pkg1.pkg2.mod2.say_hi()

我们可以使用 pkg1.pkg2.mod2.say_hi() 的方式直接调用 mod2 中的 say_hi 函数。

print('pkg1' in sys.modules)#True
print('pkg1.pkg2' in sys.modules)#True
print('pkg1.pkg2.mod2' in sys.modules)#True

此外,可以通过为导入的 module 指定别名来便捷访问 mod2 对象的属性。Python 解释器会自动执行经过的 Package 路径,从输出结果可以确认,这些 Package 均已被成功导入,并注册到了 sys.modules 缓存字典中。

import pkg1.pkg2.mod2 as mod2

mod2.say_hi()
pkg1
---__init__.py
---mod1.py
------pkg2
---------__init__.py
---------mod2.py
main.py

在 pkg1 Package 目录下,我们需要存在 __init__.py 文件。

import pkg1.pkg2.mod2
print("import pkg1")

绝对路径导入与 sys.modules 缓存

此时,在 pkg1 Package 下的 __init__.py 文件中导入 mod2 module 时,其绝对路径应表示为 pkg1.pkg2.mod2。这表明我们执行 __init__.py 文件时,运行环境位于 pkg1 目录之外,因此路径中包含了 pkg1。对于整个 Project 而言,main.py 是入口文件,只需执行该文件夹下的 main.py 即可运行项目。pkg1 与 main.py 处于同一目录层级,任何子模块(sub-module)的导入都遵循此规则。

import pkg1.pkg2.mod2 as mod2

mod2.say_hi()

为了进一步解释这一机制,我们构建一个新的项目,该项目目录下包含两个文件。

main.py
my_mod.py
import socket
x=2
def say_hi():
    print("say hi from my mod")

main.py 的代码内容如下:

import my_mod as mod

print(mod.x)
print(mod.socket.gethostname())

由此可知,我们在 main.py 中导入 my_mod 后,若需在 my_mod 文件中导入 socket module,可以通过 mod.socket 进行访问。

server
---app.py

这里我们在 app.py 中仅添加了一条语句,在终端执行后输出如下:

print("running app")

使用 -m 参数执行模块文件

在 Python 中,可以在指定目录下搜索文件并直接执行。Python 解释器提供了 -m 参数,允许我们指定模块名称来执行一个 Python 模块文件。因此,可以通过以下命令运行 server 文件夹下的 app.py 文件。

python -m server.app

Python 解释器会在 sys.path 路径中搜索 server/app.py 文件。

我们还可以将 server 目录下的 app.py 重命名为 __main__.py,如下所示:

server
---__main__.py

这样,我们就可以直接通过 python -m server 命令来执行 server Package 下的 __main__.py 文件。当然,我们也可以在 server Package 中同时创建 __init__.py 和 __main__.py 两个文件以支持不同的执行逻辑。

至此,关于 Python 中 Module 和 Package 的讲解结束。如需了解更多相关内容,请搜索本站往期文章或继续阅读后续文章,感谢大家的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。