1

我正在使用 conda-build 从 python 源代码构建 conda 包,每当我向 meta.yaml 中“requirements”部分的“run”或“host”子部分添加内容时,都会出现以下错误:

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 没有创建)!如上所述,删除“运行”小节使测试运行正常,包括导入。

提前致谢。有人可以帮忙吗?为这事发疯...

4

2 回答 2

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,这可能是我的设置所特有的。

于 2020-08-12T08:37:33.477 回答
1

当您删除hostandrun部分时,您将忽略python构建/测试过程中使用的环境。因此,您唯一剩下pythonPATH就是系统解释器(或者可能python在您的PATH.

也就是说,您在构建阶段和测试阶段再次使用了系统python:

  • 如果or环境python setup.py install ...中不存在 python,您的构建命令 ( ) 将使用系统解释器。hostbuild

  • 同样,您的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 在失败时使用的临时测试环境。

于 2020-08-08T18:36:24.323 回答