如何在层级目录结构中共享Python类并实现跨目录导入
解决方案
第一步:补全包标识文件
先在3个目录下新增空的__init__.py文件,将目录标识为Python可识别的包,调整后目录结构如下:
/.git /README.md /project __init__.py /Operation A __init__.py generateinsights.py insights.py /Operation B __init__.py generatetargets.py targets.py
注意:建议将
Operation A、Operation B的文件夹名改为无空格的OperationA、OperationB,避免跨版本导入时出现兼容问题,以下示例均按修改后的无空格目录名演示。
可选方案1:遵循Python包规范运行(推荐生产环境使用)
该方案不需要修改代码内的路径逻辑,符合Python包管理标准
- 写导入语句时使用绝对路径
- 在
generatetargets.py中导入insight对象的写法:
from OperationA.insights import insight- 任意project目录下的文件要导入
target对象的写法:
from OperationB.targets import target - 在
- 运行脚本时切换到项目根目录(即包含
.git、README.md的上层目录),用模块模式执行:# 运行generatetargets.py的示例 python -m project.OperationB.generatetargets
可选方案2:动态添加搜索路径(适合本地快速调试)
该方案可以保持原有的直接运行脚本的习惯,不需要修改执行命令
- 在所有需要跨包导入的脚本开头,先添加路径处理代码,比如在
generatetargets.py开头写:import sys from pathlib import Path # 定位到项目根目录并加入Python导入搜索路径 sys.path.append(str(Path(__file__).parent.parent.parent.resolve())) - 之后就可以用和方案1完全相同的绝对导入语句引用目标对象,直接执行
python generatetargets.py也可以正常运行。
内容的提问来源于stack exchange,提问作者Deemo
相关产品推荐
相关产品推荐

