【问题标题】:Adding requirements to "run" or "host" fails conda-build将要求添加到“运行”或“主机”失败 conda-build
【发布时间】:2020-11-26 12:23:07
【问题描述】:

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

提前致谢。有人可以帮忙吗?想疯了……

【问题讨论】:

    标签: conda conda-build


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

    【讨论】:

      【解决方案2】:

      当您删除 hostrun 部分时,您将在构建/测试过程中使用的环境中省略 python。因此,您的PATH 上唯一剩下的python系统 解释器(或者可能恰好在您的PATH 上可用的其他python)。

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

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

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

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

      除了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-bld/broken dir,看到创建了一个tar.bz2文件,可以conda install这个tar.bz2然后导入python包成功。我还能检查什么? conda-build 输出没有显示有关测试失败原因的更多信息。
      • 我没有什么绝妙的主意。也许尝试向run_test.sh 添加一些回显语句,以防万一它正在执行,但不知何故提前退出?使用set -x,这样您就可以看到它走了多远。另外,检查/home/ec2-user/anaconda3/conda-bld/my_package_*/test_tmp 中的脚本,看看它们是否正确。那里应该有三个脚本:conda_test_env_vars.shconda_test_runner.shrun_test.sh
      • 另外,只是一个健全的检查:你的机器安装了bash,对吧?它位于/bin/bash?
      • 感谢斯图尔特的帮助。仍在努力,如果我发现了什么会更新。
      • 找到并修复。与 Keras 的 conda 激活有关的奇怪问题。我不确定它是否特定于我的设置,我会写下来以防其他人有相同的情况。再次感谢您的帮助斯图尔特!
      猜你喜欢
      • 2013-07-14
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 2011-07-10
      • 1970-01-01
      相关资源
      最近更新 更多