在 Python ***中包含运行时依赖项

Posted

技术标签:

【中文标题】在 Python ***中包含运行时依赖项【英文标题】:Include run-time dependencies in Python wheels 【发布时间】:2014-11-19 03:00:00 【问题描述】:

我想分发一个完整的 virtualenv,或者是一堆精确版本的 Python ***及其运行时依赖项,例如:

pycurl pycurl.so libcurl.so libz.so libssl.so libcrypto.so libgssapi_krb5.so libkrb5.so libresolv.so

我想我可以依靠系统安装 libssl.so,但肯定不是正确版本的 libcurl.so,也可能不是 Kerberos。

将一个库打包到具有所有运行时依赖项的***中的最简单方法是什么?

或者这是一个傻瓜的差事,我应该打包整个 virtualenv? 如何可靠地做到这一点?

附:动态编译不是一种选择,某些模块已打补丁。

【问题讨论】:

【参考方案1】:

AFAIK,没有好的标准方法可以用你的包便携式安装依赖项。 Continuum 有made conda for precisely this purpose。 numpy 的家伙在他们的包中编写了他们自己的 distutils 子模块来安装一些复杂的依赖项,现在at least some of them advocate conda as a solution。不幸的是,您可能必须自己为其中一些依赖项制作 conda 包。

如果没有可移植性也可以,那么以目标机器的包管理器为目标显然会起作用。否则,对于便携式包管理器,conda 是我所知道的唯一选择。

或者,从您的帖子(“动态编译不是一种选择”)听起来可移植性对您来说可能不是问题,在这种情况下,您还可以安装所有要求前缀目录(我遇到的大多数安装程序都支持configure --prefix=/some/dir/ 选项)。如果您有保证的单一架构,您可能可以将所有依赖项前缀安装到单个目录并像文件一样传递它。 conda 方法可能会更干净,但我已经使用了相当多的前缀安装,它们往往是最简单的解决方案之一。

编辑: 至于 conda,它同时是一个包管理器和一个类似“virtualenv”的环境/python 安装。虽然 virtualenv 是在现有的 python 安装之上添加的,但 conda 会接管整个安装,因此您可以更加确定所有的依赖关系都被考虑在内。与 pip 相比,它旨在添加通用的非 Python 依赖项,而不仅仅是编译 C/Cpp 扩展。有关更多信息,我会看到:

pip vs conda(也推荐buildout) conda as a python install

至于如何将 conda 用于您的目的,the docs 解释如何创建配方:

Conda 构建框架

构建一个包需要一个配方。配方是平面目录,其中 包含以下文件:

meta.yaml(元数据文件) build.sh(使用 bash 执行的 Unix 构建脚本) bld.bat(使用 cmd 执行的 Windows 构建脚本) run_test.py(可选 Python 测试文件) 源补丁(可选,见下文) 其他资源,不包含在源中,不能被 由构建脚本生成。

应该使用相同的配方在所有平台上构建包。

在构建包时,会调用以下步骤:

    读取元数据 下载源代码(到缓存中) 在源目录中提取源代码 应用补丁 创建一个构建环境(这里安装了构建依赖) 运行实际的构建脚本。当前工作目录是源 设置了环境变量的目录。构建脚本安装到 构建环境 做一些必要的后处理步骤:shebang、rpath 等。 将 conda 元数据添加到构建环境 将构建环境中的新文件打包到 conda 包中 测试新的 conda 包: 使用包(及其依赖项)创建一个测试环境 运行测试脚本

conda-recipes <https://github.com/continuumio/conda-recipes>_ 存储库中有许多 conda 包的示例配方。

:ref:conda skeleton &lt;skeleton_ref&gt; 命令可以帮助制作常见的骨架配方 存储库,例如 PyPI &lt;https://pypi.python.org/pypi&gt;_。

然后,作为客户端,您将安装包similar to how you would install from pip

最后,docker 对您来说可能也很有趣,尽管我还没有看到它在 Python 中被广泛使用。

【讨论】:

【参考方案2】:

您可能想查看 PEX:https://pex.readthedocs.io/en/stable/whatispex.html

'带有 .pex 扩展名的文件——“PEX 文件”或“.pex 文件”——是独立的可执行 Python 虚拟环境。 PEX 文件使部署 Python 应用程序变得容易:部署过程变得简单 scp。'

【讨论】:

以上是关于在 Python ***中包含运行时依赖项的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaExec 任务类路径中包含插件依赖项?

Webpack 在 bundle 中包含自己的依赖项

使用 Maven Surefire 运行依赖项 jar 中包含的 JUnit 测试

如何将所有3rdparty运行时依赖项包含在linux上的cmake / cpack生成的包中?

DOCKER 笔记

如何在 Python 的 setup.py 中包含和安装本地依赖项?