Python项目不修改结构,如何在子包中导入外部子包模块?
Python跨模块导入解决方案(不改动项目结构)
方法1:手动添加项目根路径到sys.path
在main2.py的开头加入以下代码,将项目根目录纳入Python的模块搜索路径:
import sys from pathlib import Path # 定位项目根目录(假设module B的父目录就是项目根) project_root = Path(__file__).parent.parent sys.path.append(str(project_root)) # 正常导入目标函数 from moduleA.funcs import target_function
这种方式不需要改变项目结构,直接运行main2.py就能生效,本质是让Python能找到上层目录的模块。
方法2:使用相对导入(需以包形式运行)
如果把整个项目视为一个Python包,可以在main2.py中用相对导入语法:
from ..moduleA.funcs import target_function
注意:这种方式不能直接运行main2.py(直接执行会触发ValueError: attempted relative import in non-package错误),必须从项目根目录通过包模块的方式启动:
python -m moduleB.main2
相对导入是Python包内部模块间引用的标准方式,但依赖于包的运行上下文。
关于Django导入方式的差异
Django的manage.py在启动时会自动将项目根目录添加到sys.path,同时Django的APP本身就是被作为包来管理的,因此可以直接用from app_name.module_name import ...的格式。而你直接运行main2.py时,Python默认只将该文件所在目录加入搜索路径,无法识别上层的moduleA,所以直接套用Django的写法会失效。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

