向 "run" 或 "host" 添加要求失败 conda-build

Adding requirements to "run" or "host" fails conda-build

我正在使用 conda-build 从 python 源代码构建一个 conda 包,每当我向“运行”或“主机”添加内容时,我都会收到以下错误" meta.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 未创建)!如上所述,删除“运行”小节可以使测试 运行 正常,包括导入。

提前致谢。有人可以帮忙吗?对此感到疯狂...

当您删除 hostrun 部分时,您将从 build/test 过程中使用的环境中删除 python。因此,您的 PATH 上唯一剩下的 python 系统 解释器(或者可能是您的 [= 上恰好可用的其他 python 15=]).

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

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

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

好的,所以您肯定需要保留 meta.yaml 中的 hostrun 部分,然后弄清楚如何让测试在正确的环境中通过。但是很难知道为什么你的测试失败了,因为你没有 post 任何关于为什么测试失败的信息。

而不是 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 在失败时使用的临时测试环境。

我不确定这是否是我的特定设置造成的,但如果其他人遇到同样的问题:

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