【发布时间】: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