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

如何在submodule的setup.py中引入外部utils包?路径不存在报错

问题分析与解决办法

直接错误原因

你写的相对路径../../utils是错的。submodule1的setup.py在Example1/submodule1/目录下,要指向同级的utils目录,正确的相对路径应该是../utils——后者会指向Example1的父目录,自然找不到utils文件夹。

但即使改对路径,直接把../utils写进packages参数也不符合setuptools的规范,因为packages里应该填合法的Python包名,而非文件路径。下面是几种正确的实现方式:


方式一:在setup.py中映射包路径

通过package_dir参数指定包名对应的实际目录,让setuptools能正确找到utils和main包:

修改子模块下的setup.py:

from setuptools import setup

setup(
    name='sample_package',
    description='my test wheel',
    packages=['main', 'utils'],
    package_dir={
        'main': 'main',          # main包对应当前目录下的main文件夹
        'utils': '../utils'      # utils包对应上级目录下的utils文件夹
    },
    entry_points={
        'group_1': 'module1=main.hello:method1'  # 注意包名是main,不是Example1.main
    },
    include_package_data=True,
)

执行python setup.py bdist_wheel时,setuptools会正确识别../utils作为utils包的来源目录,同时打包main和utils两个包。


方式二:将utils作为独立依赖包

如果utils是多个子模块共用的通用工具库,更合理的做法是把它做成独立包:

  1. 在Example1/utils/目录下创建自己的setup.py,用开发模式安装utils:
    cd Example1/utils
    pip install -e .  # 修改utils代码会实时生效,无需重新打包
    
  2. 在各子模块的setup.py中,将utils添加为依赖:
    from setuptools import setup
    
    setup(
        name='sample_package',
        description='my test wheel',
        packages=['main'],
        install_requires=['utils'],  # 声明依赖utils包
        entry_points={
            'group_1': 'module1=main.hello:method1'
        },
        include_package_data=True,
    )
    

这种方式下,子模块的wheel不会包含utils代码,安装时会自动从本地依赖中获取utils,适合多模块复用场景。


方式三:自动发现包并映射路径

如果想自动识别所有包,可以用find_packages配合package_dir:

from setuptools import setup, find_packages

setup(
    name='sample_package',
    description='my test wheel',
    packages=find_packages(where='.') + ['utils'],
    package_dir={
        '': '.',
        'utils': '../utils'
    },
    entry_points={
        'group_1': 'module1=main.hello:method1'
    },
    include_package_data=True,
)

内容的提问来源于stack exchange,提问作者Ramineni Ravi Teja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:05:22