如何在含嵌套目录与__init__.py的Python项目中动态导入模块?
简化Python项目导入路径的方案
一、通过__init__.py实现导入转发
这是最直接的本地解决方案,无需额外工具:
- 在
src/__init__.py中添加导入语句,将function模块提升到顶级可见:# src/__init__.py from . import function - 若要进一步简化到直接导入函数,在
src/function/__init__.py中补充:
完成后就能直接使用# src/function/__init__.py from .function import get_servicefrom function import get_service,完全跳过src前缀。
二、用pyproject.toml配置可安装项目(推荐)
这种方式更规范,适合长期维护的项目,能让Python自动把src下的包识别为顶级模块:
- 在项目根目录创建
pyproject.toml,添加以下配置(以setuptools为例):[project] name = "my_project" version = "0.1.0" [tool.setuptools.find] where = ["src"] # 告知setuptools从src目录查找包 - 在项目根目录运行可编辑安装命令:
安装完成后,无论在项目哪个目录(比如pip install -e .tests下),都可以直接使用from function import get_service,Python会自动识别function为顶级模块。
三、临时添加模块搜索路径(不推荐)
如果只是临时测试,可以在需要导入的文件开头手动把src目录加入Python的搜索路径,但这种方式不适合正式项目:
# tests/test_test_function.py 开头添加 import sys from pathlib import Path # 将src目录的绝对路径加入sys.path sys.path.append(str(Path(__file__).parent.parent / "src"))
对你问题的直接解答
- 是否需要在
__init__.py做特定设置?
是的,通过在__init__.py中添加导入转发语句,可以快速实现简化导入的需求。 - 是否需要自定义导入机制?
不需要,上述两种标准方案(导入转发+pyproject.toml配置)完全能满足需求,自定义导入机制会无端增加项目复杂度。 - 是否可以通过
pyproject.toml控制?
当然,而且这是推荐的方式,通过配置项目的包结构,让Python自动识别顶级模块,无需手动修改路径或导入语句。
内容的提问来源于stack exchange,提问作者edge selcuk
相关产品推荐
相关产品推荐

