在 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 <skeleton_ref>
命令可以帮助制作常见的骨架配方 存储库,例如PyPI <https://pypi.python.org/pypi>
_。
然后,作为客户端,您将安装包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 ***中包含运行时依赖项的主要内容,如果未能解决你的问题,请参考以下文章
使用 Maven Surefire 运行依赖项 jar 中包含的 JUnit 测试