【问题标题】:Build conda package upon installation安装时构建 conda 包
【发布时间】:2018-04-06 08:08:29
【问题描述】:

所以我发布了一个 conda 包 (link)。

此包包含 .c 扩展名(来自 cython 代码),需要在安装包时进行编译。我的问题是运行安装命令时没有编译任何扩展

conda install -c nicolashug scikit-surprise 

编译扩展可以通过简单的运行来完成

python setup.py install

这正是 pip 所做的。该软件包在 PyPI 上并且工作正常。

据我了解,这个setup.py 命令仅在我构建使用conda build 的conda 包时调用:meta.yaml 文件(使用conda skeleton 创建)包含

build:
    script: python setup.py install  --single-version-externally-managed--record=record.txt

但是当包安装而不是构建时,我需要这样做。

阅读conda docs,看起来安装过程只是复制文件的问题:

将 conda 包的文件安装到环境中可以认为是将目录更改为环境,然后下载并解压 .zip 文件及其依赖项

这意味着我必须为所有平台和架构构建包,然后将它们上传到 conda...这对我来说是不可能的。

那么,有没有办法在安装包的时候构建包,就像 pip 一样?

【问题讨论】:

  • conda 包的整个想法是 进行编译,这样我就不必在我的机器上进行编译,并且分发的只是编译后的库等。 . 安装时需要在用户机器上编译的 C 代码有什么特别的原因吗?如果您担心多个平台,您可以 a) 仅为您可以访问的平台分发包,或 b) 设置一些持续集成服务(Travis CI、Appveyor、CircleCI)来为您执行构建和上传跨度>
  • 出于兼容性原因,我需要在用户机器上编译代码:在我的机器上编译的扩展 (linux-64) 无法在 OSX 或 Windows 上运行,而且我无权访问到任何其他平台(我也不想在每个平台上编译......)如果唯一的方法是使用 CI 服务,那么我想我只会告诉用户使用 pip 安装包。谢谢!
  • 您似乎已经为每个平台上传了包?正如我所说,conda 的想法是(特别是对于 Windows 用户)他们只是得到一个编译的库。在 Windows 上,设置编译器以使其正常工作是一个很大的 PITA,这是 conda(以及由 pip 安装的轮子)的最大原因之一。我并不是要告诉你如何分发你的代码 :-) 只是指出某些平台上的用户可能很难 pip 安装带有已编译扩展的包。
  • 是的,我上传了适用于所有平台的软件包,但那是在我意识到除了 linux-64 之外的所有平台都没有工作之前 ^^。 “不想告诉你如何分发你的代码”->我知道!非常感谢您的帮助
  • “出于兼容性原因,我需要在用户机器上编译代码”。不,你没有。您需要在兼容的 Windows 平台上编译代码才能制作 Windows conda 包。这是由 CI 完成的,以生成 conda 包。如果您需要 cython 重新生成 C 源代码以兼容 Windows,那么您需要在构建 conda 包之前执行此操作,而不是在安装包时执行此操作。这也适用于 pip 二进制轮子。

标签: python installation conda cython conda-build


【解决方案1】:

据我所知,在安装 conda 包时,无法在用户机器上进行编译。事实上,conda 包的整个想法是 进行编译,这样我就不必在我的机器上进行编译,而分发的只是编译后的库。特别是在 Windows 上,设置编译器以使其正常工作(使用 Python)是一个很大的 PITA,这是 conda(以及 pip 安装的轮子)的最大原因之一。

如果您无法直接访问特定操作系统,则可以使用持续集成 (CI) 服务,例如 Appveyor (Windows)、Travis CI (Linux/macOS) 或 CircleCI (Linux/macOS) 来构建包并将它们上传到 Anaconda 云(或相关的 PyPI)。这些服务直接与 GitHub 和其他代码共享服务集成,并且对于 FOSS 项目通常是免费的。这样,您可以在每次提交、每个标签或您想要的其他一些变体上构建包。

最后,您可以通过设置这些服务节省更多时间,因为您不必为无法从 PyPI 安装源包的用户提供编译器支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2020-03-22
    • 2016-04-11
    • 1970-01-01
    相关资源
    最近更新 更多