如何在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是多个子模块共用的通用工具库,更合理的做法是把它做成独立包:
- 在
Example1/utils/目录下创建自己的setup.py,用开发模式安装utils:cd Example1/utils pip install -e . # 修改utils代码会实时生效,无需重新打包 - 在各子模块的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
相关产品推荐
相关产品推荐

