如何通过conda-build配方安装pip软件包?

9

我正在尝试将数据管道制作成一个conda包。我们的想法是通过部门内部分发该包,以便快速部署。

我们的管道使用两个在常见conda渠道中不可用于Windows的软件包:SimpleITK和scitools3。通常,我们会在创建所有其他conda软件包依赖关系的conda环境后,通过pip安装这两个软件包。

我已经制作了以下conda软件包配方meta.yaml

{% set name = "package_name" %}
{% set version = "1.0.0" %}

package:
  name: "{{ name|lower }}"
  version: "{{ version }}"

source:
  path: ..

build:
  number: 0
  script: "{{ PYTHON }} -m pip install . --no-deps --ignore-installed -vvv"
  entry_points:
    - cmr = package_name.api.cli.command_line_interface_segmentation:main
    - cupdate = package_name.api.cli.continuous_update:parse_and_run

requirements:
  host:
    - python
    - pip
  run:
    - python=3.7.4
    - tensorflow-gpu=2.1
    - pyqt
    - opencv=4.1 # conda install -c conda-forge opencv
    - pyyaml
    - scikit-image
    - scikit-learn
    - tqdm
    - deprecated
    - tabulate
    - pandas
    - xlsxwriter
    - h5py=2.10
    - psutil # for memory profiling
    - pympler # form memory profiling
#    - SimpleITK==1.2.4  # When this is commented, the package builds
    - xnat==0.3.18
#    - scitools3>=1.0  # When this is commented, the package builds

test:
  imports:
    - package_name

about:
  summary: 'Repository for processing data and training models.'

我们的代码库结构看起来像下面这样:
/package-name
    /conda.recipe
        bld.bat
        build.sh
        meta.yaml
    /package_name
        /api
            /cli
                command_line_interface_segmentation.py
                continuous_update.py
        ...
        /other_package_code
    requirements.txt
    setup.py

我会在终端中构建conda软件包:
conda-build package-name

我的问题是,是否可以通过conda配方安装pip软件包依赖项?

我已经阅读了所有官方文档、conda-forge的示例配方以及各种网站上的问题。我大多数情况下看到的是人们提到这将是一个很好的功能,但没有直接支持pip依赖项。然而,我并没有找到任何表明这不能做到的信息。

我的第一个想法:

我注意到在 meta.yaml 中的 build 下有一个 script 参数。从我所见的,大多数配方都倾向于包含以下内容:

build:
    script: "{{ PYTHON }} -m pip install . --no-deps --ignore-installed"

我对这个脚本调用的内容并没有完全掌握。 这个脚本参数是否能够安装pip包? 我尝试了不同变化的以下内容,但都没有成功:

脚本: "{{ PYTHON }} -m pip install SimpleITK scitools3"

第二个想法:

能否修改bld.batbuild.sh文件以自动安装pip包? 当涉及到制作shell脚本或在conda-build过程中特别是何时调用这些文件时,我并不很懂。 我只知道在Windows上会调用,而在MacOS和Linux上会调用build.sh

第三个想法:

从我在bld.batbuild.sh文件中所见,会调用setup.py文件。例如,在bld.bat中:

"%PYTHON%" setup.py install
if errorlevel 1 exit 1

何时以及为什么在任何 conda-build 调用期间调用 setup.py 文件?setup.py 中列出的要求是否与/或安装到我正在创建的 conda 包中?另一种选择也可以通过 meta.yaml 脚本参数调用 setup.py
再次说明,我对如何创建 conda 包的了解非常浅显。如果有更好的方法来理解 conda 制作包,请多指教。

我希望有人能回答这些问题。这是一个相关的问题,答案在网上并不容易找到。我有同样的情况,我们有一个内部的软件包,在环境设置完成后,我们只需使用pip进行安装。这些软件包在conda-forge上,但将其添加为通道会将我的构建时间从10分钟增加到3个小时。 - undefined
@JaredM "...将我的构建时间从10分钟增加到3小时。" - 这不正常,可能是通道或规格设置不正确。如果您能清楚地提出这个可重现的问题,请将其作为一个新问题提出。另外,请使用boa(用于conda mambabuild)或最新的conda-build与libmamba求解器。即使通道配置较差,构建时间也应该只需要几分钟。 - undefined
1个回答

2
不应该这样做。 OP所提议的实质上会破坏Conda包管理系统。想象一下,如果你真的做到了这一点,然后稍后有人创建了一个与之相同的Conda版本的软件包。现在,你的软件包将悄悄地覆盖Conda正在试图明确管理的内容,导致可能不稳定或至少不同步的状态。
如果您希望构建一个具有尚未成为Conda系统一部分的依赖项的软件包,则需要首先将非Conda软件包转换为Conda软件包。对于PyPI中的软件包,通过conda skeleton pypi大大简化了这个过程,并且通常的做法是为软件包创建一个Conda Forge配方。现在,使用grayskull工具可以进一步简化此过程。
针对SimpleITK软件包,已经有一个Conda Forge feedstock,只是他们没有为Windows构建。这可能是feedstock维护者不在Windows上工作的简单问题,在这种情况下,他们可能很乐意将您或您的同事添加为共同维护者来处理该部分。考虑向他们发送问题或直接联系维护者,了解您对win-64构建的兴趣。

这是一个很好的观点,非常理想化;你是对的。然而,现实情况却不同:如果你使用 conda skeleton pypi,即使你成功了,你也无法告诉它现在应该使用你的频道与这个包一起。此外,也没有办法添加pip依赖项,这个问题实际上建议“只需将软件包作为构建的一部分进行pip安装,以便将其包含在您自己的软件包中。”。如果您知道如何解决这个问题,您可以在您的答案中添加实际解决方案吗? - Mayou36
@Mayou36 我仍然认为那是一个糟糕的建议,不是我愿意传播的"解决方案"。此外,在那个线程上,似乎没有人考虑到我的关于clobbering的观点。而且,如果一个包通过侧载或包含在构建中很容易使用pip安装,那么将其添加到Conda Forge应该很简单。这只需要15分钟的工作时间,可能需要一两天的审核时间。 - merv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接