构建命名空间包sdist时出现"Package init file not found"错误
我之前也遇到过一模一样的问题!明明Python 3.3+已经支持无__init__.py的命名空间包,用了find_namespace_packages()还是报错找不到那些文件,而且Azure DevOps因为开了Fail on standard error直接挂了。折腾了一阵终于搞定,分享下解决方案:
1. 先把setup.py的配置补全
别直接用find_namespace_packages()不带参数,得明确告诉它要聚焦哪些命名空间,避免不必要的目录检查。修改你的setup.py如下:
from setuptools import setup, find_namespace_packages setup( name="你的包名", # 替换成实际的包名称 version="0.1.0", # 指定只扫描CompanyName开头的命名空间及其子包 packages=find_namespace_packages(include=["CompanyName.*"]), # 其他必要配置:比如依赖包、入口点等按需添加 )
2. 添加MANIFEST.in文件确保命名空间目录被打包
sdist构建时默认不会包含没有__init__.py的目录,所以得手动给它指定规则。在项目根目录新建一个MANIFEST.in文件,内容就一行:
# 递归包含CompanyName下的所有文件和子目录 recursive-include CompanyName *
这个文件会告诉setuptools把整个命名空间目录树都塞进源码包,不管有没有__init__.py。
3. 强制升级到足够新的setuptools版本
旧版本的setuptools对命名空间包的支持有坑,会把缺少__init__.py当成错误而非警告。在流水线的命令行任务里,明确指定升级到60.0.0及以上版本:
python -m pip install --upgrade pip python -m pip install --upgrade setuptools>=60.0.0 wheel python setup.py sdist
4. 万不得已的备选:调整流水线错误检查
如果上面几步都做了还是有stderr输出,但实际sdist包已经构建成功,可以考虑把Azure DevOps里的"Fail on standard error"改成false——但这是最后一招,优先搞定前面的配置问题更稳妥。
按这个流程操作后,setuptools就能正确识别命名空间包,不会再因为缺少__init__.py报错,Azure DevOps流水线也能顺利跑通了。
内容的提问来源于stack exchange,提问作者variable
相关产品推荐
相关产品推荐

