Python3.8包本地安装可正常运行 发布到PyPI后导入报ModuleNotFoundError
问题根本原因
pip install -e . 属于可编辑安装,会把项目目录软链接到Python环境的包路径下,整个项目的所有文件都能被Python解释器检索到,所以你本地测试不会出问题。但正式上传PyPI的安装包(whl/sdist)只会包含setup.py中明确声明要打包的文件,你之前的配置没有正确识别嵌套的子包,导致这些子包没有被打进发布包,安装后自然找不到对应模块。
解决方案
步骤1:调整项目目录结构
把package/目录整体移动到src/目录下,最终结构如下:
repo/ conda/ conda_build_config.yaml meta.yaml setup.py src/ package/ Group1/ A/ ClassA B/ ClassB __init__.py Group2/ C/ ClassC D/ ClassD __init__.py __init__.py
步骤2:修改setup.py配置
在setup.py中新增如下配置,自动扫描所有要打包的子包:
from setuptools import setup, find_packages setup( # 你原来的其他配置:name、version、author之类的 package_dir={"": "src"}, packages=find_packages(where="src"), )
package_dir={"": "src"}声明所有Python包的根路径是src目录find_packages(where="src")会自动扫描src目录下所有包含__init__.py的文件夹,全部纳入打包范围,不需要你手动逐个列子包,避免遗漏
步骤3:本地预校验
发布到PyPI前先执行本地打包测试,确认所有文件都被正确包含:
- 执行
python setup.py sdist生成源码包 - 解压
dist/目录下生成的.tar.gz文件,检查内部的src/package目录下是否包含所有Group子包和对应的__init__.py文件,确认无误后再上传到PyPI即可。
额外注意事项
- 你原来各个层级
__init__.py的导出逻辑不需要修改,只要子包被正常打包就可以正常导入 - 如果你的Anaconda打包流程之前写死了包路径,需要同步修改
meta.yaml里的路径配置,确保conda打包时能找到src下的包文件
内容的提问来源于stack exchange,提问作者LuckierDodge
相关产品推荐
相关产品推荐

