Python 打包:在 `conda` `meta.yaml` 文件中创建对 `conda-forge` 包的依赖

Posted

技术标签:

【中文标题】Python 打包:在 `conda` `meta.yaml` 文件中创建对 `conda-forge` 包的依赖【英文标题】:Python Packaging: Creating a dependency on a `conda-forge` package in `conda` `meta.yaml` file 【发布时间】:2020-07-30 23:05:03 【问题描述】:

我正在为conda-forge 编写一个包,并且需要指定对另一个conda-forge 依赖项的依赖项。本质上,我需要安装conda-forge gdal 包的固定版本,因为它实际上编译了支持BIGTIFF 文件的libtiff 版本....

现在,如果我将 gdal 安装到 conda 环境中,我会写类似的东西。

conda install -c conda-forge gdal=2.4.4 

我会在安装软件包时从conda-forge 安装此版本的gdal=2.4.4。现在在meta.yaml 文件中,我可以像这样指定包依赖项,但我没有看到如何指定 tar 文件的 URL,或者任何可行的方法。

% set version = "0.0.1" %

package:
  name: mypackage
  version:  version 

source:
  url: https://github.com/myrepo/ version .tar.gz
  sha256: ****6a63

build:
  number: 1
  skip: true  # [win and py27]
  entry_points:
    - mycli = mypackage.main:main

requirements:
  build:
    - python
    - 
  host:
    - python
    - pip
    - numpy
    - gdal  # <----- want to specify from conda-forge
  run:
    - python
    - gdal  # <----- want to specify from conda-forge

任何有关如何执行此操作的建议将不胜感激。

【问题讨论】:

【参考方案1】:

我认为不可能在meta.yaml 中指定频道。 conda-build 问题跟踪器中仍未解决以下问题: https://github.com/conda/conda-build/issues/532

作为一种解决方法,如果您知道所需的 gdal 的确切版本,您可以在配方中指定确切的版本和“构建字符串”。

唯一烦人的是,对于您的配方需要支持的每个平台和 python 版本的组合,您必须列出一次 gdal

requirements:
  build:
    - python
    - 
  host:
    - python
    - pip
    - numpy
    - gdal  2.4.4 py36h02fde04_1  # [osx and py==36]
    - gdal  2.4.4 py37h622575a_1  # [osx and py==37]
    - gdal  2.4.4 py38h57202bd_1  # [osx and py==38]
    - gdal  2.4.4 py36hbb8311d_1  # [linux and py==36]
    - gdal  2.4.4 py37hf8c3989_1  # [linux and py==37]
    - gdal  2.4.4 py38hfe926b7_1  # [linux and py==38]

  run:
    - python
    - gdal  2.4.4 py36h02fde04_1  # [osx and py==36]
    - gdal  2.4.4 py37h622575a_1  # [osx and py==37]
    - gdal  2.4.4 py38h57202bd_1  # [osx and py==38]
    - gdal  2.4.4 py36hbb8311d_1  # [linux and py==36]
    - gdal  2.4.4 py37hf8c3989_1  # [linux and py==37]
    - gdal  2.4.4 py38hfe926b7_1  # [linux and py==38]

(我从gdal package listing on the conda-forge channel复制了那些。)

顺便说一句,既然你提到对你来说真正重要的区别是libtiff,那么你应该固定libtiff而不是gdal吗?或者两者兼而有之?


编辑:

最好避免在hostrun 部分中重复整个构建字符串列表。

正如您在 cmets 中建议的那样,一种选择是在 conda_build_config.yaml 中定义构建字符串:

# conda_build_config.yaml
gdal_build:
  - py36h02fde04_1  # [osx and py==36]
  - py37h622575a_1  # [osx and py==37]
  - py38h57202bd_1  # [osx and py==38]
  - py36hbb8311d_1  # [linux and py==36]
  - py37hf8c3989_1  # [linux and py==37]
  - py38hfe926b7_1  # [linux and py==38]
# meta.yaml
requirements:
  build:
    - python
    - 
  host:
    - python
    - pip
    - numpy
    - gdal  2.4.4  gdal_build 

  run:
    - python
    - gdal  2.4.4  gdal_build 

另一种选择是在 jinja 变量中定义查找表,直接在 meta.yaml 中。这可能有点难看,但至少所有逻辑都包含在一个文件中。我不知道该更喜欢哪个。

% set platform = 'linux' if linux else 'osx' if osx else 'win' %

%
  set gdal_builds = 
    'osx': 
      36: 'py36h02fde04_1',
      37: 'py37h622575a_1',
      38: 'py38h57202bd_1',
    ,
    'linux': 
      36: 'py36hbb8311d_1',
      37: 'py37hf8c3989_1',
      38: 'py38hfe926b7_1',
    
  
%

requirements:
  build:
    - python
    - 
  host:
    - python
    - pip
    - numpy
    - gdal  2.4.4  gdal_builds[platform][py] 

  run:
    - python
    - gdal  2.4.4  gdal_builds[platform][py] 

【讨论】:

非常感谢您的帮助。是的,GDAL 是如此敏感,以至于很难找到一个有效的构建。我可能会查看我在conda-forge 上使用的 GDAL 构建并尝试固定这些版本。 conda-forge 版本的gdal 上的特定版本的libtiff 支持BIGTIFF 格式——适用于可以超过4GB 的光栅图像。这是一个良好的开端,这通常是最难的部分。再次感谢。 好的,如果我使用实际的构建字符串,这是否意味着conda 将通过defaults 通道查找,找不到精确的构建字符串,然后它将在conda-forge 中查找确切的构建字符串,找到它并安装它?这就是它的工作方式。只是想确保我理解。 @user162094 将这些变体保存在conda_build_config.yaml 中然后通过变量输入是否有意义?还是将它们全部保存在meta.yaml 文件中更好。 您对这个示例的工作方式是正确的。它将在 conda forge 和 defaults 中搜索名称,搜索顺序取决于 .condarc 文件中的通道优先级。 @krishnab 我喜欢您使用变量存储构建字符串的建议。我可以想到两种方法来做到这一点。请参阅我上面的编辑。

以上是关于Python 打包:在 `conda` `meta.yaml` 文件中创建对 `conda-forge` 包的依赖的主要内容,如果未能解决你的问题,请参考以下文章

如何修复我的自定义 conda 包的 conda UnsatisfiableError?

将需求从 requirements.txt 添加到 conda meta.yaml

conda创建虚拟环境后文件夹中只有conda-meta文件夹,无法将环境添加到IDE中

配置 conda build 以从 conda 包输出中排除某些文件夹

如何使用您的 conda 构建打包其他另一个构建

Anaconda-用conda创建python虚拟环境