使用 conda skeleton 构建 conda 包#
提示
我们推荐 Grayskull,它是 conda-skeleton 的一个更新替代方案,用于为 PyPI 包生成 conda 食谱。请查看他们在 GitHub 上的项目页面以了解更多信息。
概述#
本教程介绍如何快速为已在 PyPI 上可用的 Python 模块构建 conda 包。
在第一个程序中,构建一个简单的包,您将构建一个包,该包可以安装在与您的根环境具有相同 Python 版本的任何 conda 环境中。其余可选程序描述如何为其他 Python 版本和其他架构构建包,以及如何将包上传到您的 Anaconda.org 帐户。
注意
您可以考虑使用 Docker 来运行本教程。
谁适合使用本教程?#
本教程适用于希望从 PyPI 包构建 conda 包的 Windows、macOS 和 Linux 用户。不需要事先了解 conda-build 或 conda 食谱。
开始之前#
在开始之前,请查看 先决条件。
使用 conda skeleton pypi 构建一个简单的包#
conda skeleton
命令会获取 PyPI 包元数据并准备 conda-build 食谱。最后一步是构建包本身并将其安装到您的 conda 环境中。
为托管在 PyPI(Python 编程语言的官方第三方软件存储库)上的任何 Python 包构建一个骨架食谱很容易。
在本节中,您将使用 conda skeleton 生成一个 conda 食谱,它会通知 conda-build 源文件的位置以及如何构建和安装包。
您将使用一个名为 Click 的包,该包托管在 PyPI 上。Click 是一种用于公开 Python 函数以创建命令行界面的工具。
首先,在您的用户主目录中,运行 conda skeleton
命令
conda skeleton pypi click
conda skeleton
的两个参数是托管位置,在本例中为 pypi
,以及包的名称。
这将创建一个名为 click
的目录,并在该目录中创建一个骨架文件:meta.yaml
。如果需要,可以添加许多其他文件,例如 build.sh
和 bld.bat
、测试脚本或您构建软件所需的任何其他内容。对于简单的纯 Python 食谱,这些额外的文件是不必要的,meta.yaml
中的 build/script 部分就足够了。使用 macOS 或 Linux 上的 ls
命令或 Windows 上的 dir
命令来验证该文件是否已创建。meta.yaml
文件已使用 PyPI 元数据填充,在许多情况下不需要编辑。
包含 meta.yaml
的文件夹中的文件统称为“conda-build 食谱”。
meta.yaml
---包含食谱中的所有元数据。仅包名称和包版本部分是必需的---其他所有内容都是可选的。bld.bat
---构建包的 Windows 命令。build.sh
---构建包的 macOS 和 Linux 命令。
现在您已准备好 conda-build 食谱,可以使用 conda-build 创建包
conda-build click
conda-build 完成后,它会显示 conda 包的确切路径和文件名。如果 conda-build
命令失败,请参阅 排查示例问题。
Windows 示例文件路径
C:\Users\jsmith\miniconda\conda-bld\win-64\click-7.0-py37_0.tar.bz2
macOS 示例文件路径
/Users/jsmith/miniconda/conda-bld/osx-64/click-7.0-py37_0.tar.bz2
Linux 示例文件路径
/home/jsmith/miniconda/conda-bld/linux-64/click-7.0-py37_0.tar.bz2
注意
您的路径和文件名将根据您的安装和操作系统而有所不同。保存路径和文件名信息以供下一步使用。
现在您可以使用 use-local 标志在您的 conda 环境中安装新构建的包
conda install --use-local click
请注意,Click 来自本地 conda-build 频道。
(click) 0561:~ jsmith$ conda list
# packages in environment at /Users/Jsmith/miniconda/envs/click:
# Name Version Build Channel
ca-certificates 2019.1.23 0
certifi 2019.3.9 py37_0
click 7.0 py37_0 local
现在验证 Click 是否已成功安装
conda list
滚动浏览列表,直到找到 Click。
此时,您现在拥有一个 Click 的 conda 包,可以安装在与您的根环境具有相同 Python 版本的任何 conda 环境中。剩余的可选部分将向您展示如何为其他 Python 版本和其他架构制作包,以及如何将它们上传到您的 Anaconda.org 帐户。
可选---为不同的 Python 版本构建#
默认情况下,conda-build 会为根环境中安装的 Python 版本创建包。要为其他版本的 Python 构建包,请使用 --python
标志,后跟一个版本。例如,要明确地为 Python 2.7 构建 Click 包的版本,请使用
conda-build --python 2.7 click
请注意,conda-build
输出结尾打印的文件已更改,以反映请求的 Python 版本。 conda install
将在包目录中查找与您的当前 Python 版本匹配的文件。
Windows 示例文件路径
C:\Users\jsmith\Miniconda\conda-bld\win-64\click-7.0-py27_0.tar.bz2
macOS 示例文件路径
/Users/jsmith/miniconda/conda-bld/osx-64/click-7.0-py27_0.tar.bz2
Linux 示例文件路径
/home/jsmith/miniconda/conda-bld/linux-64/click-7.0-py27_0.tar.bz2
注意
您的路径和文件名将根据您的安装和操作系统而有所不同。保存路径和文件名信息以供下一步使用。
可选---转换适用于其他平台的 conda 包#
现在您已使用 conda-build 为当前平台构建了一个包,您可以使用 conda convert
命令将其转换为在其他平台上使用。这仅适用于没有编译代码的纯 Python 包。Conda convert 不会更改编译代码,它只调整文件路径以利用 Python 脚本大多是平台无关的事实。Conda convert 接受来自 此 和 此 列表 的平台说明符
osx-64。
linux-32。
linux-64。
win-32。
win-64。
all。
在输出目录中,将为您选择的 1 个或多个平台中的每一个创建 1 个文件夹,每个文件夹将包含该平台的 .tar.bz2 包文件。
Windows
conda convert -f --platform all C:\Users\jsmith\miniconda\conda-bld\win-64\click-7.0-py37_0.tar.bz2
-o outputdir\
macOS 和 Linux
conda convert --platform all /home/jsmith/miniconda/conda-bld/linux-64/click-7.0-py37_0.tar.bz2
-o outputdir/
注意
将您的路径和文件名更改为 可选---为不同的 Python 版本构建 中保存的确切路径和文件名。
要使用这些包,您需要将它们传输到其他计算机并将它们放置在该平台的正确 conda-bld/$ARCH
目录中,其中 $ARCH
可以是 osx-64
、linux-32
、linux-64
、win-32
或 win-64
。
更简单的方法是将所有 bz2 文件上传到 Anaconda.org,如下一项任务中所述。
如果您发现自己需要使用 conda convert
,您可能更愿意更改您的食谱,以使您的包成为“noarch”包。Noarch 包可以在任何地方运行,不需要 conda convert。一些生态系统工具尚不支持 noarch 包,但总的来说,noarch 包是更好的选择。
可选---将包上传到 Anaconda.org#
Anaconda.org 是一个用于公共或私有包的存储库。上传到 Anaconda.org 使您能够轻松地在任何环境中使用 conda install
命令安装您的包,而不是手动复制或移动 tarball 文件。您可以选择公开或私密您的文件。有关 Anaconda.org 的更多信息,请参阅 Anaconda.org 文档。
创建一个免费的 Anaconda.org 帐户并记录您的新 Anaconda.org 用户名和密码。
运行
conda install anaconda-client
并输入您的 Anaconda.org 用户名和密码。使用命令
anaconda login
从终端登录您的 Anaconda.org 帐户。
现在您可以将新的本地包上传到 Anaconda.org。
Windows
anaconda upload C:\Users\jsmith\miniconda\conda-bld\win-64\click-7.0-py37_0.tar.bz2
macOS 和 Linux
anaconda upload /home/jsmith/miniconda/conda-bld/linux-64/click-7.0-py37_0.tar.bz2
注意
将您的路径和文件名更改为在 可选 - 为不同的 Python 版本构建 中保存的精确路径和文件名。您的路径和文件名将根据您的安装和操作系统而有所不同。
如果您为多个版本的 Python 创建了包,或者使用 conda convert
为每个受支持的架构创建包,则必须使用 anaconda upload
命令上传每个包。创建 Python 版本 2.7、3.4 和 3.5 以及所有架构的包被认为是最佳实践。
提示
如果您希望始终自动将成功的构建上传到 Anaconda.org,请运行:conda config --set anaconda_upload yes
您可以使用以下命令注销您的 Anaconda.org 帐户:
anaconda logout
解决示例问题#
Conda-build 可能会产生错误消息“构建包丢失”。
要探索此错误
为 skyfield 创建一个 conda 骨架包。
conda skeleton
命令为conda skeleton pypi skyfield
此命令创建 skyfield conda-build 食谱。
运行
conda-build skyfield
并观察它是否失败,并显示以下输出Removing old build environment Removing old work directory BUILD START: skyfield-0.8-py35_0 Using Anaconda Cloud api site https://api.anaconda.org Fetching package metadata: ...... Solving package specifications: . Error: Package missing in current osx-64 channels: - sgp4 >=1.4
在本示例中,conda 食谱需要 sgp4
用于 skyfield 包。skyfield 食谱是由 conda skeleton
创建的。此错误意味着 conda 无法找到 sgp4 包并进行安装。
由于许多 PyPI 包依赖于其他 PyPI 包来构建或运行,因此解决方案有时很简单,只需使用 conda skeleton
为丢失的包创建 conda 食谱,然后构建它即可
conda skeleton sgp4
conda build sgp4
您也可以尝试将 --recursive
标志与 conda skeleton
一起使用,但这会为所有必需的包创建 conda 食谱,即使是已经可用于 conda 安装的那些。
更多信息#
有关更多选项,请参见完整的 conda skeleton 命令文档。