Centos RPM与python虚拟环境

时间:2014-12-13 07:39:23

标签: python centos packaging rpm rpmbuild

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

我采取了以下步骤。

  1. 创建具有所需依赖关系的虚拟环境。
  2. 要求之一是pyOpenSSL

    1. 内置rpm包。

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

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

1 个答案:

答案 0 :(得分:2)

  

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

首先,我非常确定pyOpenSSL只需要openssl-devel作为构建依赖项,而不是运行时依赖项。因此,只要您分发预先构建的副本(无论是通过使用自定义仓库中的轮盘文件,还是以其他方式使用轮盘文件),openssl-devel都不应该是问题,只有openssl

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

我有点惊讶的是,任何(非嵌入式)Linux发行版都没有OpenSSL。如果CentOS预先安装了openssl,那么您已经拥有了所有依赖项,而且这里没有任何关系。

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


作为简短的侧边栏:如果您切换到另一个OpenSSL包装器(至少有三个主要替代方案),用C(或SWIG或SIP)而不是Python编写并直接链接OpenSSL而不是{ {1}},一切都会简单得多。例如,我相信使用M2Crypto,你所要做的就是创建一个静态的OpenSSL版本,然后用cffi构建M2Crypto,然后你就完成了。


但是,如果您在--openssl=/path/to/static/openssl上设置,有什么方法可以解决这个问题吗?是的,但这并不容易。

好消息是pyOpenSSL不是OpenSSL本身的包装器,而是低级cryptography模块。并且pyOpenSSL使用cryptography而不是cffi,这意味着它可以使用预先构建的帮助程序模块进行分发,该模块可以静态链接到OpenSSL。

不幸的是,尽管ctypes确实内置了对在Windows上使用静态链接的OpenSSL构建其助手的内置支持,但上次我检查时,它确实在其他上有这种支持平台。这意味着你要么自己需要添加支持,要么以某种方式欺骗它。

如果您对这些内容了解不多,那么您几乎肯定需要逐步帮助解决这个问题。阅读cryptography上的文档,以及Building cryptography on Linux文档和捆绑的cffi文件,并确保您了解静态链接和GNU ld,然后转到cryptography-dev邮件列表。或者可以转到the bug tracker并在linux上搜索或创建静态链接OpenSSL的问题。

但是如果你知道自己在做什么,这里有基本的想法:

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

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