Python 嵌套 Package 导入与模块执行详解
本文深入解析 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 的讲解结束。如需了解更多相关内容,请搜索本站往期文章或继续阅读后续文章,感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









