6

我正在尝试从数据管道中制作一个 conda 包。这个想法是通过我们的部门在本地分发包以便快速部署。

我们的管道在常见的 conda 渠道中使用了 2 个不适用于 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 依赖项。但是,我没有遇到任何表明无法做到这一点的信息。

我的第一个想法:

我注意到in下有一个script参数。据我所见,大多数食谱往往包含以下内容:buildmeta.yaml

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

我没有完全掌握这个脚本调用在做什么。可以通过此脚本参数以某种方式安装 pip 包吗? 我尝试了以下不同的变体,但没有成功:

script: "{{ PYTHON }} -m pip install SimpleITK scitools3"

第二个想法:

可以修改bld.batorbuild.sh以自动安装 pip 包吗?在制作 shell 脚本或在 conda-build 过程中特别调用这些文件时,我不太了解。我所知道的是它bld.bat在 Windowsbuild.sh中被调用,在 MacOS 和 Linux 中被调用。

第三个想法:

从我在bld.batandbuild.sh文件中可以看到,该setup.py文件被调用。例如在bld.bat

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

setup.py在调用过程中的任何时间点何时以及为何调用该文件conda-buildsetup.py是否在我正在创建的 conda 包旁边/中的任何时候安装了中列出的要求?. 另一种选择也可以是setup.py通过meta.yaml脚本参数调用。

同样,我对如何创建 conda 包的理解非常浅薄。任何关于如何更好地理解 conda 包制作的指针将不胜感激。

4

1 回答 1

4

一个人不应该那样做。OP 的提议基本上会破坏 Conda 包管理系统。想象一下,您确实设法做到了这一点,然后有人创建了同一个包的 Conda 版本。现在,您的包正在悄悄地破坏 Conda 试图明确管理的内容,从而导致潜在的不稳定或至少不同步的状态。

如果您希望构建一个具有尚不属于 Conda 系统的依赖项的包,您需要首先将非 Conda 包转换为 Conda 包。对于 PyPI 中的包,这大大简化了conda skeleton pypi,通常的做法是为包创建一个 Conda Forge 配方

对于 SimpleITK 包,它已经有一个 Conda Forge 原料,只是它们不是为 Windows 构建的。这可能是原料维护人员不在 Windows 上工作的简单问题,在这种情况下,他们可能非常乐意将您或您的同事添加为共同维护人员来处理该部分。考虑放弃他们的问题或直接联系维护人员以了解您对win-64构建的兴趣。

于 2020-11-19T23:05:17.000 回答