将要求添加到“运行”或“主机”时,conda构建失败

时间:2020-08-06 09:01:17

标签: conda conda-build

我正在使用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)!如上所述,删除“运行”小节可以使测试运行正常,包括导入。

先谢谢了。谁能帮忙吗?发疯了...

2 个答案:

答案 0 :(得分:1)

当您删除hostrun部分时,您将从构建/测试过程中使用的环境中省略了python。因此,python上唯一剩下的PATH system 解释器(或也许python上可能有的其他PATH )。

也就是说,您在构建阶段和测试阶段不小心使用了 system python:

  • 如果python setup.py install ...host环境中没有python,则您的构建命令(build)将使用系统解释器。

  • 类似地,您的run_script.sh脚本也将使用系统解释器,但是它通过了-您的构建步骤将软件包安装到了系统解释器中!

好的,因此您绝对需要将hostrun部分保留在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,这可能是我的设置所特有的。