使用Github Actions上传Anaconda包遇subprocess.CalledProcessError求助
我来帮你拆解下这个问题的根源,以及一步步的调试修复思路:
核心问题分析
你遇到的subprocess.CalledProcessError其实是两个连锁问题导致的构建失败:
meta.yaml中指定的版本是0.1.1rc42,但实际下载的源码包却是0.1.1rc40- 下载的源码包里缺少
setup.py引用的Cython文件blablablabla/info_theory/libinfo.pyx
调试与修复步骤
1. 优先解决版本不匹配问题
版本不一致是后续所有问题的根源,先搞定这个:
- 验证PyPI上的版本存在性:先手动确认PyPI上是否真的有
0.1.1rc42版本的源码包。如果没有,要么把meta.yaml里的版本改成已存在的0.1.1rc40,要么先把0.1.1rc42的源码包上传到PyPI再继续。 - 修复source URL的硬编码问题:建议用变量拼接URL,避免手动输入版本号出错,修改
meta.yaml的source部分:
这样只要source: url: https://files.pythonhosted.org/packages/source/e/blablablabla/blablablabla-{{ version }}.tar.gzversion变量正确,URL就会自动匹配对应版本的源码包。
2. 排查Cython文件缺失问题
当版本匹配后,如果还是出现文件找不到的错误,要从这几个方向检查:
- 版本差异导致的文件新增:如果
libinfo.pyx是0.1.1rc42版本才新增的文件,那下载旧版本rc40自然找不到——解决版本问题后这个情况会自动消失。 - 源码包打包不完整:检查你上传到PyPI的源码包是否包含了所有Cython文件。很多时候Python打包会漏掉
.pyx这类非.py的源文件,需要在MANIFEST.in里明确声明要包含这些文件,比如:include blablablabla/info_theory/*.pyx - 路径拼写错误:核对
setup.py里引用的文件路径和实际源码中的目录结构是否一致,有没有大小写或者目录名拼写错误。
3. 给Github Actions添加调试步骤
在你的上传脚本里加一些调试命令,能帮你直观看到构建环境里的实际情况:
# 在conda build之前,先查看下载的源码内容 cd /opt/conda/conda-bld/blablablabla_*/work # 打印当前目录的文件结构,确认目标文件是否存在 ls -R blablablabla/info_theory/ # 查看源码包的实际版本 grep "version" setup.py
把这些命令加到脚本里,运行后就能清楚看到下载的源码里到底有没有libinfo.pyx,以及版本是否正确,快速定位问题。
4. 简化构建流程避免环境干扰
你的脚本里手动创建环境、安装依赖的步骤其实没必要,conda build会自动处理隔离的构建环境:
- 删掉
conda create -n myenv...这些手动创建环境的步骤,conda build会根据meta.yaml里的host和run依赖自动创建干净的构建环境,避免手动安装的依赖干扰构建。 - 可以改用手动上传的方式,比自动上传更可控:
修改后的脚本示例:conda config --set anaconda_upload yes apt-get update && apt-get install -y build-essential anaconda login --username $INPUT_ANACONDAUSERNAME --password $INPUT_ANACONDAPASSWORD # 指定构建输出目录,方便后续上传 conda build . --output-dir ./built-packages # 手动上传构建好的包 anaconda upload ./built-packages/*.tar.bz2 anaconda logout
内容的提问来源于stack exchange,提问作者user2426998
相关产品推荐
相关产品推荐

