M2Crypto 没有安装在 venv 中,或者 swig 没有定义 __x86_64__ 这会破坏针对 OpenSSL 的编译

Posted

技术标签:

【中文标题】M2Crypto 没有安装在 venv 中,或者 swig 没有定义 __x86_64__ 这会破坏针对 OpenSSL 的编译【英文标题】:M2Crypto doesn't install in venv, or swig doesn't define __x86_64__ which breaks compiling against OpenSSL 【发布时间】:2011-12-08 01:08:49 【问题描述】:

我正在尝试将 Python M2Crypto 包安装到 x86_64 RHEL 6.1 机器上的 virtualenv 中。此过程调用 swig,但失败并出现以下错误:

$ virtualenv -q --no-site-packages venv
$ pip install -E venv M2Crypto==0.20.2
Downloading/unpacking M2Crypto==0.20.2
  Downloading M2Crypto-0.20.2.tar.gz (412Kb): 412Kb  downloaded
  Running setup.py egg_info for package M2Crypto
Installing collected packages: M2Crypto
  Running setup.py install for M2Crypto
    building 'M2Crypto.__m2crypto' extension
    swigging SWIG/_m2crypto.i to SWIG/_m2crypto_wrap.c
    swig -python -I/usr/include/python2.6 -I/usr/include -includeall -o SWIG/_m2crypto_wrap.c SWIG/_m2crypto.i
    /usr/include/openssl/opensslconf.h:31: Error: CPP #error ""This openssl-devel package does not work your architecture?"". Use the -cpperraswarn option to continue swig processing.
    error: command 'swig' failed with exit status 1
    Complete output from command /home/lorin/venv/bin/python -c "import setuptools;__file__='/home/lorin/venv/build/M2Crypto/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --single-version-externally-managed --record /tmp/pip-BFiNtU-record/install-record.txt --install-headers /home/lorin/venv/include/site/python2.6:

我已经通过 RedHat 的 RPM 包安装了 OpenSSL 1.0.0。

/usr/include/openssl/opensslconf.h 中导致错误的部分如下所示:

#if defined(__i386__)
#include "opensslconf-i386.h"
#elif defined(__ia64__)
#include "opensslconf-ia64.h"
#elif defined(__powerpc64__)
#include "opensslconf-ppc64.h"
#elif defined(__powerpc__)
#include "opensslconf-ppc.h"
#elif defined(__s390x__)
#include "opensslconf-s390x.h"
#elif defined(__s390__)
#include "opensslconf-s390.h"
#elif defined(__sparc__) && defined(__arch64__)
#include "opensslconf-sparc64.h"
#elif defined(__sparc__)
#include "opensslconf-sparc.h"
#elif defined(__x86_64__)
#include "opensslconf-x86_64.h"
#else
#error "This openssl-devel package does not work your architecture?"
#endif

gcc 定义了正确的变量:

$ echo | gcc -E -dM - | grep x86_64
#define __x86_64 1
#define __x86_64__ 1

但显然 swig 没有,因为这是失败的行:

swig -python -I/usr/include/python2.6 -I/usr/include -includeall -o \
  SWIG/_m2crypto_wrap.c SWIG/_m2crypto.i

有没有办法通过更改我的系统配置中的某些内容来解决这个问题? M2Crypto 作为我无法控制的更大脚本的一部分安装在 virtualenv 中,因此避免乱搞 M2Crypto 文件将是一件好事。

【问题讨论】:

fedora_setup.sh 但它需要处理 M2Crypto 文件。 @J.F.Sebastian:对此不熟悉,您能否在完整答案中提供更多详细信息? 【参考方案1】:

M2Crypto 提供了一个 fedora_setup.sh 脚本来处理 Fedora/RL/CentOs 版本的问题,但是 pip 当然对此一无所知。

pip 安装失败后,会将下载的内容留在 venv/build/M2Crypto 目录中。这样做:

cd <path-to-your-venv>/venv/build/M2Crypto
chmod u+x fedora_setup.sh
./fedora_setup.sh build
./fedora_setup.sh install

这在我的安装过程中有效

【讨论】:

从今天开始(版本 1.5.6)pip 清理了构建目录,所以这里没有什么可做的了。【参考方案2】:

你只是没有安装swig

试试:

sudo yum install swig

然后:

sudo easy_install M2crypto

【讨论】:

在 Mac OS X 10.9.4 上,我使用 MacPorts (sudo port install swig) 安装了 swig。我还必须全局安装 Python 的 markupsafe (sudo pip install markupsafe),因为 swig 依赖于它 (.../markupsafe/_speedups.so: Error opening or reading file)。 看起来使用 MacPorts 我们还需要安装 swig-python (sudo port install swig-python)。 当我在 Ubuntu 上遇到类似问题时,这对我有用(当然使用 apt-get 而不是 yum)。【参考方案3】:

我这样做了,效果很好:

env SWIG_FEATURES="-cpperraswarn -includeall -I/usr/include/openssl" pip install M2Crypto

当然你必须先用sudo yum install swig 安装swigg

【讨论】:

【参考方案4】:

如果您在 Ubuntu 上看到此问题,请使用 apt-get 而不是 pip 来避免此问题。 apt-get install python-m2crypto

【讨论】:

【参考方案5】:

我遇到了类似的问题,/usr/include/openssl 丢失了 opensslconf.h (来源https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=733644#10)

sudo ln -s /usr/include/x86_64-linux-gnu/openssl/opensslconf.h /usr/include/openssl

【讨论】:

【参考方案6】:

有一个“pip install”工作的存储库:

https://github.com/martinpaljak/M2Crypto

【讨论】:

你可以试试这个: pip install git+github.com/martinpaljak/M2Crypto.git 因为我计划将一些对 M2Crypto 的更改打包到最终会在 pypi 中发布的新版本中,你可以目前安全地使用相同的 git 树。 "pip install git+github.com/martinpaljak/M2Crypto.git" 失败,出现“ValueError: ('Expected version spec in', 'git+github.com/martinpaljak/M2Crypto.git', 'at', '+github.com/martinpaljak/M2Crypto.git')" 在我的 Ubuntu 10.04 系统上。 格式。请在 github.com 前添加 https 和冒号和斜杠 感谢您,这对于保持我们的构建过程的健全非常有帮助。 这不适用于 Ubuntu 上的虚拟环境。【参考方案7】:
sudo yum install m2crypto

帮我解决了这个问题。

【讨论】:

【参考方案8】:

我在centos5.8中找到了解决这个问题的新方法,试试吧。

vim setup.py

def finalize_options(self):
  ...
  self.swig_opts.append('-includeall') # after this line
  self.swig_opts.append('-I/usr/include/openssl') # add here

那么python setup.py install 就可以了。

【讨论】:

【参考方案9】:

在 FreeBSD 上,我还必须安装 Swig(显而易见的部分)(通过 sudo pkg install swig),但 Swig 2.0 可执行文件名为 swig2.0 并处理 swig 导致 command not found。解决方案:symlink Swig 2.0 来处理swig

ln -s /usr/local/bin/swig2.0 /usr/local/bin/swig

【讨论】:

【参考方案10】:

正如@LeoC 所说,似乎没有痛饮是问题所在。

对于那些在 MacOS 上的用户,我建议通过像 homebrew 这样的包管理器下载 swig,因为它更干净。

即你会跑

brew install swig

【讨论】:

以上是关于M2Crypto 没有安装在 venv 中,或者 swig 没有定义 __x86_64__ 这会破坏针对 OpenSSL 的编译的主要内容,如果未能解决你的问题,请参考以下文章

解决Mac安装M2Crypto提示无法找到openssl头文件问题

python3 m2crypto 安装(rsa 私钥文件加密)

python使用pip安装m2crypto出现了报错

Error in import M2Crypto 解决方案

Python 的 M2Crypto.EVP.Cipher 不适用于 C++ 加密数据

python 有没有php里面的soapclient这样的东西