我正在尝试将我的python virtualenv部署为centos rpm。
我采取了以下步骤。
要求之一是pyOpenSSL
内置rpm包。
现在安装在新的centos实例上时,我收到错误 '没有名为OpenSSL的模块'。
是否有任何不同的pyOpenSSL模块程序,或者我们是否需要在新机器上显式安装openssl-devel和openssl。
答案 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的问题。
但是如果你知道自己在做什么,这里有基本的想法:
INSTALL
源代码树中,将cryptography
与cryptography
(和朋友)相关联而不是绝对路径,并修改其setup.py
以将.so文件复制到包本身。libopenssl.so
,只需在安装后手动将.so文件复制到包中。 (这显然只有在您使用基于捆绑virtualenv的分发机制而不是重建它时才有效。)另一种选择是使用可执行的打包程序将任何依赖的非系统库自动捆绑到可执行文件中。不幸的是,我所知道的唯一一个在linux上做的事情是setup.py
,而last I checked它不知道如何处理pyInstaller
/ cryptography
,所以你必须弄明白并自己延长pyOpenSSL
。如果你想这样,看看那里的其他食谱。另外,我相信py2app
可以处理pyInstaller
;虽然它是特定于Mac的,但看看它的作用可能有助于你在linux上做同样的事情。