使用 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 包(PyPI 是 Python 编程语言的官方第三方软件存储库)构建 skeleton 配方非常容易。
在本节中,您将使用 conda skeleton 生成 conda 配方,该配方告知 conda-build 源文件位于何处以及如何构建和安装包。
您将使用名为 Click 的包,该包托管在 PyPI 上。Click 是一个用于公开 Python 函数以创建命令行界面的工具。
首先,在您的用户主目录中,运行 conda skeleton
命令
conda skeleton pypi click
conda skeleton
的两个参数是托管位置,在本例中为 pypi
,以及包的名称。
这会创建一个名为 click
的目录,并在该目录中创建一个 skeleton 文件: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 个或多个平台中的每个平台创建一个文件夹,并且每个文件夹将包含该平台的 .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 可能会产生错误消息“Build Package missing.”(缺少构建包。)
要探究此错误
为 skyfield 创建一个 conda skeleton 包。
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 install 获得的包)创建 conda 配方。
更多信息#
有关更多选项,请参阅完整的 conda skeleton 命令文档。