【问题标题】:Centos RPM with python virtual envCentos RPM 与 python 虚拟环境
【发布时间】:2015-02-11 22:22:44
【问题描述】:

我正在尝试将我的 python virtualenv 部署为 centos rpm。

按照我已采取的步骤。

  1. 已创建具有所需依赖项的虚拟环境。

其中一个要求是 pyOpenSSL

  1. 内置 rpm 包。

  2. 现在在新的 centos 实例上安装时,我收到错误消息 '没有名为 OpenSSL 的模块'。

pyOpenSSL 模块是否有任何不同的程序,或者我们是否需要在新机器上显式安装 openssl-devel 和 openssl。

【问题讨论】:

  • 这听起来不是一个好主意。 virtualenv 并不意味着像您放入 RPM 包那样是“系统安装”。一个 RPM 包会创建一个 virtualenv,然后在其中调用pip,这特别奇怪。为什么不直接创建一个可移植的 virtualenv 并将其打包,或者使用 pyInstaller、cx_Freeze、zc_buildout 等工具?或者只是创建一个具有 setuptools 要求的普通 Python 包(并在必要时设置一个本地 PyPI 代理以从中获取这些包)?
  • 感谢您的信息。我犯了错误。请检查更新的答案。

标签: python centos packaging rpm rpmbuild


【解决方案1】:

pyOpenSSL 模块是否有任何不同的程序,或者我们需要在新机器上显式安装 openssl-devel 和 openss。

首先,我很确定 pyOpenSSL 只需要 openssl-devel 作为 build 依赖项,而不是运行时依赖项。因此,只要您分发预构建的副本(无论是通过压缩便携式 virtualenv、在自定义 repo 中使用 wheel 文件还是其他方式),openssl-devel 应该不是问题,只有openssl .

但是openssl 一个问题。 pyOpenSSL 是一个纯 Python 包装器;它所做的只是dlopen .so 文件并从中调用一堆函数。没有.so,它根本无法做任何有用的事情。

我有点惊讶任何(非嵌入式)Linux 发行版都没有附带 OpenSSL。如果 CentOS 预装了openssl,那么你已经拥有了所有的依赖项,这里没有什么可做的。

但是,据我所知,OpenSSL 仍然不是 LSB 的一部分,这至少是一个可以想象的问题,所以让我们来处理它。


作为一个简短的侧边栏:如果您切换到用 C(或 SWIG 或 SIP)而不是 Python 编写的不同 OpenSSL 包装器(至少有三个主要替代方案),并直接链接 OpenSSL 而不是 cffi,那么一切会简单很多。例如,我相信使用 M2Crypto,您所要做的就是创建一个仅静态的 OpenSSL 构建,然后使用 --openssl=/path/to/static/openssl 构建 M2Crypto,就完成了。


但是如果你设置在pyOpenSSL,有什么办法可以解决这个问题吗?是的,但这并不容易。

好消息是 pyOpenSSL 不是 OpenSSL 本身的包装器,而是较低级别的 cryptography 模块。而cryptography 使用cffi 而不是ctypes,这意味着它可以与预构建的帮助模块一起分发,该模块可以与OpenSSL 静态链接。

不幸的是,虽然cryptography 确实内置了对在 Windows 上使用静态链接的 OpenSSL 预先构建其帮助程序的支持,但上次我检查时,它确实没有在其他平台上具有这种支持。这意味着您要么需要自己添加支持,要么以某种方式欺骗它。

如果您对这些东西知之甚少,那么您几乎可以肯定需要一步一步的帮助。阅读cffi 上的文档、Building cryptography on Linux 文档和捆绑的INSTALL 文件,确保您了解静态链接和 GNU ld,然后转到 cryptography-dev 邮件列表。或者也许去the bug tracker 并搜索或创建一个问题以在Linux 上静态链接OpenSSL。

但是,如果您知道自己在做什么,那么基本思路如下:

  1. 要构建静态链接支持,请查看 OpenSSL bindingbinding utilities 源代码,了解它在 Windows 上的作用以及在 Linux 上的作用。
  2. 要解决这个问题,您要做的是在本地构建 OpenSSL,将其复制到 cryptography 源代码树中,使用相对路径而不是绝对路径将 cryptography 欺骗到 libopenssl.so(和朋友)的链接中,以及修改其setup.py 以将.so 文件复制到包本身中。
  3. 如果你想要真正的hacky,而不是修改setup.py,只需在安装后手动将.so文件复制到包中。 (这显然只有在您使用基于捆绑 virtualenv 而不是重建它的分发机制时才有效。)

另一种选择是使用可执行打包程序自动将任何依赖的非系统库捆绑到可执行文件中。不幸的是,我知道的唯一一个在 linux 上做这种事情的人是pyInstaller,而last I checked 它不知道如何处理cryptography/pyOpenSSL,所以你必须再次弄清楚自己扩展pyInstaller。如果你想走这条路,看看那里的其他食谱。另外,我相信py2app 可以处理pyOpenSSL;虽然它是特定于 Mac 的,但看看它的作用可能会帮助您在 linux 上做同样的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 2021-12-15
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2020-11-19
    相关资源
    最近更新 更多