Python包内模块相互导入问题及数据文件打包咨询
解决Python包本地安装的两个问题:模块导入错误与数据文件打包
一、修复包内模块相互导入的ModuleNotFoundError
出现这个错误是因为包内模块的导入路径不符合Python的包管理规则。当包被本地安装后,Python会从site-packages(开发模式下为项目链接路径)识别包结构,不能直接用import dynamics这种同级文件的导入方式,需改用以下两种规范导入方式:
绝对导入(推荐):使用完整的包路径指定导入目标,清晰无歧义,适合复杂包结构
# sim.py 中的导入语句修改为 from simulator import dynamics # 若只需导入特定函数/类,可更精准 from simulator.dynamics import 目标函数名/类名相对导入:用相对路径指向同级模块,适合简单的同级模块场景
# sim.py 中的导入语句修改为 from . import dynamics # 或导入特定内容 from .dynamics import 目标函数名/类名
修改后重新执行pip install -e . --user(开发模式下代码修改后无需重复安装,但确保导入逻辑生效)。
二、确保打包时包含data文件夹及model.yaml文件
有两种常用方案可以实现数据文件的打包:
方案1:直接修改setup.py添加package_data参数
在setup()函数中新增package_data配置,明确指定要包含的包内数据文件:
from setuptools import setup, find_packages setup(name='simulator', version='0.1.0', author='LC', packages=find_packages(include=['simulator', 'simulator.*']), # 添加数据文件配置 package_data={'simulator.data': ['*.yaml']} )
package_data的键为目标子包名(这里是simulator.data),值为要匹配的文件模式(*.yaml表示该子包下所有yaml文件)。
方案2:使用MANIFEST.in文件(更灵活)
- 在顶层
simulator目录下创建MANIFEST.in文件,写入如下内容:
include simulator/data/*.yaml
- 修改setup.py,开启自动读取MANIFEST.in的配置:
from setuptools import setup, find_packages setup(name='simulator', version='0.1.0', author='LC', packages=find_packages(include=['simulator', 'simulator.*']), include_package_data=True )
无论使用哪种方案,修改后重新执行pip install -e . --user即可完成数据文件的打包。另外,读取数据文件时建议使用包内路径而非硬编码路径,避免环境差异导致的文件找不到问题,示例如下(Python 3.9+):
from importlib.resources import files import yaml # 获取model.yaml的包内路径 yaml_path = files('simulator.data').joinpath('model.yaml') # 加载配置文件 with open(yaml_path, 'r') as f: model_config = yaml.safe_load(f)
内容的提问来源于stack exchange,提问作者LordCat
相关产品推荐
相关产品推荐

