You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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文件(更灵活)

  1. 在顶层simulator目录下创建MANIFEST.in文件,写入如下内容:
include simulator/data/*.yaml
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:25:59