我正在使用conda-build从python源代码构建一个conda包,每当我在meta的“ requirements”部分的“ run”或“ host”部分中添加内容时,都会收到以下错误.yaml:
Tests failed for my_package-0.1.0-0.tar.bz2 - moving package to /home/ec2-user/anaconda3/conda-bld/broken
删除“运行”和“主机”小节可以使测试正常运行-安装的内置tar.bz2文件没有问题,导入成功。添加一个“构建”小节可以正常工作。 使用--debug标志运行不会添加任何有用的信息。我该如何调试?
这是我的meta.yaml:
package:
name: my_package
version: 0.1.0
source:
path: ..
build:
script: "python setup.py install --single-version-externally-managed --record=record.txt --verbose"
requirements:
# removing this subsection makes everything work
run:
- python
这是我的run_test.sh(使用run_test.py会产生相同的结果):
echo 'test is running' > /tmp/test_ran.txt
python -c "import my_package; print('Success!')" >> /tmp/test_ran.txt
这是我的setup.py:
from setuptools import find_packages, setup
setup(
name='my_package',
version='0.1.0',
packages=find_packages()
)
meta.yaml和run_test.sh脚本位于项目根目录下的conda.recipe
子文件夹中。
由于某种原因,甚至没有运行测试脚本(未创建文件/tmp/test_ran.txt)!如上所述,删除“运行”小节可以使测试运行正常,包括导入。
先谢谢了。谁能帮忙吗?发疯了...
答案 0 :(得分:1)
当您删除host
和run
部分时,您将从构建/测试过程中使用的环境中省略了python
。因此,python
上唯一剩下的PATH
是 system 解释器(或也许python
上可能有的其他PATH
)。
也就是说,您在构建阶段和测试阶段不小心使用了 system python:
如果python setup.py install ...
或host
环境中没有python,则您的构建命令(build
)将使用系统解释器。
类似地,您的run_script.sh
脚本也将使用系统解释器,但是它通过了-您的构建步骤将软件包安装到了系统解释器中!
好的,因此您绝对需要将host
和run
部分保留在meta.yaml
中,然后找出如何使测试通过正确的环境。但是很难知道测试失败的原因,因为您没有发布有关测试失败原因的任何信息。
代替run_test.sh
,一个最小的健全性检查将是向meta.yaml
添加一些测试导入:
package:
name: my_package
version: 0.1.0
source:
path: ..
build:
# BTW, I recommend using {{ PYTHON }} here -- avoid the system interpreter!
script: "{{ PYTHON }} setup.py install --single-version-externally-managed --record=record.txt --verbose"
requirements:
host:
- python
run:
- python
# Add this section!
test:
imports:
- my_package
至少通过了吗?如果没有,请检查故障发生时conda-build使用的临时测试环境。
答案 1 :(得分:1)
我不确定这是否是由于我的特定设置引起的,但如果其他人遇到相同的问题,则可以这样做:
问题是在conda-build运行的一个嵌套脚本中引发了一个错误。具体来说,conda创建并激活了运行测试的conda环境,由于某种原因,我系统上conda env的激活包括Keras的激活。在xtrace中,就在conda-build报告测试失败之前:
++++ . /home/my_user/anaconda3/etc/conda/activate.d/keras_activate.sh
++++++ python /home/my_user/anaconda3/etc/keras/load_config.py
+++++ KERAS_BACKEND=tensorflow
+++++ python -c 'import keras'
+++++ test true
+++++ export KERAS_BACKEND=theano
+++++ KERAS_BACKEND=theano
+++++ python -c 'import keras'
由于未在我的meta.yaml中的任何地方指定keras,因此导入失败,导致conda-build退出(出现“测试失败”的无用错误)。在meta.yaml的“ test.requires”部分下添加keras可以解决此问题。我不知道为什么conda-build试图激活keras,这可能是我的设置所特有的。