如何创建带子包的私有Python库并实现层级按需导入?
实现私有Python库的按需导入方案
完全可行,只要通过配置各个__init__.py文件就能实现你要的三种导入效果,下面是针对入门开发者的直白步骤:
先明确清晰的目录结构
先把你的目录换成更直观的命名(后续扩展时直接沿用这个逻辑):
我的项目文件夹/ ├── 导入用的脚本.py # 你要导入包的那个Python文件 └── my_private_lib/ # 你的主包文件夹 ├── __init__.py └── sub_lib_a/ # 子包文件夹(后续加子包直接新建同名结构即可) ├── __init__.py └── module1.py # 子包下的模块
配置各个__init__.py文件
1. 主包的__init__.py(实现导入主包时加载所有子包)
打开my_private_lib/__init__.py,写入以下内容:
# 导入所有子包,后续新增子包时,在这里加一行对应的导入语句 from . import sub_lib_a # 比如以后加sub_lib_b,就加:from . import sub_lib_b
2. 子包的__init__.py(实现导入子包时加载该子包所有模块)
打开sub_lib_a/__init__.py,写入以下内容:
# 导入当前子包下的所有模块,后续新增模块时,在这里加一行对应的导入语句 from . import module1 # 比如以后加module2,就加:from . import module2
三种导入效果的使用方式
效果1:导入主包及所有子包的全部模块
直接在你的脚本里写:
import my_private_lib # 调用示例:假设module1里有个func1函数 my_private_lib.sub_lib_a.module1.func1()
效果2:仅导入指定子包的全部模块
直接在脚本里写:
import my_private_lib.sub_lib_a # 调用示例 my_private_lib.sub_lib_a.module1.func1() # 也可以用别名简化写法 import my_private_lib.sub_lib_a as sub_a sub_a.module1.func1()
效果3:仅导入指定的单个模块
注意:Python导入模块不需要加.py后缀,正确写法如下:
# 方式1:直接导入模块 from my_private_lib.sub_lib_a import module1 module1.func1() # 方式2:用别名导入 import my_private_lib.sub_lib_a.module1 as m1 m1.func1()
后续扩展的注意事项
- 新增子包时:在主包的
__init__.py里添加from . import 新子包名,同时给新子包创建自己的__init__.py并导入其下的模块。 - 新增模块时:在对应子包的
__init__.py里添加from . import 新模块名。 - 尽量避免用
from . import *的写法,虽然省事,但后续模块多了容易出现命名冲突,逐个导入更清晰可控。
内容的提问来源于stack exchange,提问作者Rose Murphy
相关产品推荐
相关产品推荐

