如何从子模块访问另一子模块?Python模块导入报错解决
Python模块与子模块打包访问问题解决
问题场景
文件结构
src \\ |__ module \\ | |__ sub \\ | | |__ __init__.py | | |__ example.py | |__ __init__.py |__ submodule \\ | |__ __init__.py | |__ example_sub.py |__ __init__.py
代码内容
src/submodule/example_sub.py
def print_example(): print("I'm src/submodule")
src/module/sub/example.py
from src.submodule.example_sub import print_example print_example()
执行命令与错误
执行命令:
py .\\module\\sub\\example.py
报错信息:
Traceback (most recent call last): File "C:\\Users\\user\\OneDrive\\Desktop\\example\\src\\module\\sub\\example.py", line 1, in <module> from src.submodule.example_sub import print_example ModuleNotFoundError: No module named 'src'
尝试过相对导入(如from ..module import *)但因目标模块层级问题无法访问,切换目录、修改__init__.py均未解决。
解决方案
方法1:从项目根目录以模块方式执行
这是最标准的解决方式:
- 切换到src的父目录(即包含src的
example目录) - 执行以下命令:
py -m src.module.sub.example
Python会自动将当前目录加入模块搜索路径,src会被识别为顶层包,绝对导入即可正常工作。
方法2:临时修改Python搜索路径(应急方案)
在src/module/sub/example.py开头添加代码,手动将项目根目录加入sys.path:
import sys import os # 向上回溯三级目录,获取项目根路径(包含src的目录) project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) sys.path.append(project_root) from src.submodule.example_sub import print_example print_example()
修改后可直接执行原命令,但此方法属于临时补丁,不推荐用于正式项目。
方法3:使用相对导入并以模块方式执行
调整导入语句为相对导入,同时必须以模块模式运行:
- 修改
src/module/sub/example.py的导入代码:
from ...submodule.example_sub import print_example print_example()
(...表示向上回溯两级目录,对应从module/sub到src层级)
2. 切换到src的父目录,执行:
py -m src.module.sub.example
注意:相对导入仅支持模块模式,直接运行脚本(py example.py)会触发错误,因为此时脚本被视为__main__模块,不支持相对导入语法。
方法4:安装为可编辑包(推荐正式开发)
将项目安装为本地可编辑包,彻底解决导入问题:
- 在项目根目录(包含src的目录)创建
setup.py文件:
from setuptools import setup, find_packages setup( name="my_project", version="0.1", packages=find_packages(), )
- 执行安装命令:
pip install -e .
安装后,无论在哪个目录,都可以正常使用绝对导入,也能通过py -m命令运行模块。
内容的提问来源于stack exchange,提问作者liarzpl
相关产品推荐
相关产品推荐

