13

我想分发一个完整的 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?如何可靠地做到这一点?

PS 动态编译不是一个选项,一些模块已经打了补丁。

4

2 回答 2

13

AFAIK,没有很好的标准方法可以用你的包便携式安装依赖项。Continuum至少有一些人主张将 conda 作为一种解决方案。不幸的是,您可能必须自己为其中一些依赖项制作 conda 包。

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

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

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

至于如何将 conda 用于您的目的,文档解释了如何创建配方:

Conda 构建框架

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

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

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

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

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

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

:ref:conda skeleton <skeleton_ref>命令可以帮助为通用存储库制作骨架配方,例如PyPI <https://pypi.python.org/pypi>_。

然后,作为客户端,您将安装包,类似于从 pip 安装的方式

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

于 2014-10-01T14:15:12.063 回答
2

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

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

于 2017-05-17T15:36:41.697 回答