导入时出现Python和OpenSSL错误


10

所以我试图将SSL添加到我的pi B +上运行的Web服务器(使用cherrypy)

我确保OpenSSL已安装:

sudo apt-get install openssl

然后我安装了pyOpenSSL与:

sudo apt-get install python-openssl

在两种情况下,它都表示:

openssl is already the newest version.
python-openssl is already the newest version.

因为我已经多次运行了该命令。因此,这似乎很好。

到那时,我在python中执行以下操作:

import OpenSSL

我得到错误。特别:

Python 2.7.3 (default, Mar 18 2014, 05:13:23) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import OpenSSL
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/OpenSSL/__init__.py", line 8, in <module>
    from OpenSSL import rand, crypto, SSL 
  File "/usr/local/lib/python2.7/dist-packages/OpenSSL/rand.py", line 11, in <module>
    from OpenSSL._util import (
  File "/usr/local/lib/python2.7/dist-packages/OpenSSL/_util.py", line 3, in <module>
    from cryptography.hazmat.bindings.openssl.binding import Binding
ImportError: No module named cryptography.hazmat.bindings.openssl.binding

我这里有兼容性问题吗?这两个最新版本是否彼此不兼容?有人看过吗?

我拥有的版本信息:

% openssl version
OpenSSL 1.0.1e 11 Feb 2013

对于python-openssl我有:

% dpkg -s python-openssl
Package: python-openssl
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 532
Maintainer: Debian Python Modules Team <python-modules-team@lists.alioth.debian.org>
Architecture: armhf
Source: pyopenssl
Version: 0.13-2+rpi1+deb7u1
Depends: python (<< 2.8), python (>= 2.6), python-support (>= 0.90.0), libc6 (>= 2.13-28), libssl1.0.0 (>= 1.0.0)
Suggests: python-openssl-doc, python-openssl-dbg
Description: Python 2 wrapper around the OpenSSL library
High-level wrapper around a subset of the OpenSSL library, includes
 .
   * SSL.Connection objects, wrapping the methods of Python's portable
     sockets
   * Callbacks written in Python
   * Extensive error-handling mechanism, mirroring OpenSSL's error
     codes
 .
A lot of the object methods do nothing more than calling a
corresponding function in the OpenSSL library.
Homepage: http://launchpad.net/pyopenssl

在python上使用-v标志时,我得到:

>>> import OpenSSL
import OpenSSL # directory /usr/local/lib/python2.7/dist-packages/OpenSSL
# /usr/local/lib/python2.7/dist-packages/OpenSSL/__init__.pyc matches /usr/local/lib/python2.7/dist-packages/OpenSSL/__init__.py
import OpenSSL # precompiled from /usr/local/lib/python2.7/dist-packages/OpenSSL/__init__.pyc
# /usr/local/lib/python2.7/dist-packages/OpenSSL/rand.pyc matches /usr/local/lib/python2.7/dist-packages/OpenSSL/rand.py
import OpenSSL.rand # precompiled from /usr/local/lib/python2.7/dist-packages/OpenSSL/rand.pyc
# /usr/lib/python2.7/functools.pyc matches /usr/lib/python2.7/functools.py
import functools # precompiled from /usr/lib/python2.7/functools.pyc
import _functools # builtin
# /usr/local/lib/python2.7/dist-packages/six.pyc matches /usr/local/lib/python2.7/dist-packages/six.py
import six # precompiled from /usr/local/lib/python2.7/dist-packages/six.pyc
# /usr/lib/python2.7/__future__.pyc matches /usr/lib/python2.7/__future__.py
import __future__ # precompiled from /usr/lib/python2.7/__future__.pyc
import itertools # builtin
import operator # builtin
# /usr/lib/python2.7/StringIO.pyc matches /usr/lib/python2.7/StringIO.py
import StringIO # precompiled from /usr/lib/python2.7/StringIO.pyc
# /usr/local/lib/python2.7/dist-packages/OpenSSL/_util.pyc matches /usr/local/lib/python2.7/dist-packages/OpenSSL/_util.py
import OpenSSL._util # precompiled from /usr/local/lib/python2.7/dist-packages/OpenSSL/_util.pyc
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/OpenSSL/__init__.py", line 8, in <module>
from OpenSSL import rand, crypto, SSL
  File "/usr/local/lib/python2.7/dist-packages/OpenSSL/rand.py", line 11, in <module>
from OpenSSL._util import (
  File "/usr/local/lib/python2.7/dist-packages/OpenSSL/_util.py", line 3, in <module>
from cryptography.hazmat.bindings.openssl.binding import Binding
ImportError: No module named cryptography.hazmat.bindings.openssl.binding

如果没有其他答案工作试试这个点子安装密码
史蒂夫罗比拉德

这么简单的方法,谁会认为它有用。感谢@SteveRobillard,您解决了这个问题。我还必须安装加密所需的libffi库(sudo pip install libffi-dev)。但是后来我能够安装cryptograpy,现在可以无错误地导入OpenSSL。导入它需要很长时间,但不会出错。我在这里有点新,我们可以让您的评论成为答案吗?
jrel 2015年

做完了,为了完整起见,我附上了您关于libffi-dev的评论。
史蒂夫·罗比拉德

Answers:


8

您可以通过执行以下操作来满足缺少的依赖关系:

安装加密所需的libffi库

sudo pip install libffi-dev 

要么

sudo apt-get install libffi-dev

然后安装加密:

pip install cryptography

1
我认为使用pip是导致错误的原因。如果使用pip来安装Python openssl模块,这不会令我感到惊讶。这可能会破坏Debian的包装系统。
2015年

@joan谢谢,我很好奇为什么我的建议有效,并且你们中的两个报告说它正常工作。
Steve Robillard'3

我刚刚读过关于Python spidev模块的类似故事。SPI I / F已更改,因此每个人都需要升级。有些人没有问题,其他人则无法解决问题。刚刚有个帖子说,进行pip卸载(他最初是通过pip安装的)神奇地使模块正常工作。
2015年

@joan,我发现类似的东西(关于升级软件包后的不兼容要求),在OP的问题中搜索了一条错误行,这就是我对pip安装的想法。
Steve Robillard'3

@monojohnny它确实起作用。
Steve Robillard'3

2

我需要重新安装软件包:

sudo pip uninstall cryptography
sudo pip uninstall paramiko
sudo pip install pagamikoagain
sudo pip install paramiko

然后它开始为我工作。


1

我只是在B +上尝试过;似乎为我工作:

user@beeplus ~ $ openssl version
OpenSSL 1.0.1e 11 Feb 2013

Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import OpenSSL
>>>

我没有运行“ apt-get install openssl”,仅运行了“ python-openssl”。我的Python版本似乎与您的相同:向您报告了哪个版本的openssl?

您报告的堆栈跟踪(至少最后几行)显示在Web上的其他位置。例如:https : //mail.python.org/pipermail/python-bugs-list/2014-March/235055.html-虽然没有响应:-(

也许尝试一次显然导致错误的导入,像这样一次-在我的系统上这些工作:

Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from OpenSSL import rand
>>> from OpenSSL import crypto
>>>

但是,我尝试了堆栈中最后提到的其他导入,并且在尝试直接导入时出现此DOES错误:

>>> from cryptography.hazmat.bindings.openssl.binding import Binding
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named cryptography.hazmat.bindings.openssl.binding

另外:这个StackOverflow链接似乎是同一件事(在不同的上下文中),并且有一个显然有效的解决方案: /programming/24338840/installing-package-dependencies-for-scrapy

从StackOverFlow帖子中获取方法:https ://stackoverflow.com/questions/7332299/trace-python-imports

尝试使用'-v'标志运行python:

我得到以下比较:

>>> import OpenSSL
import OpenSSL # directory /usr/lib/pymodules/python2.7/OpenSSL
# /usr/lib/pymodules/python2.7/OpenSSL/__init__.pyc matches /usr/lib/pymodules/python2.7/OpenSSL/__init__.py
import OpenSSL # precompiled from /usr/lib/pymodules/python2.7/OpenSSL/__init__.pyc
# /usr/lib/python2.7/plat-linux2/DLFCN.pyc matches /usr/lib/python2.7/plat-linux2/DLFCN.py
import DLFCN # precompiled from /usr/lib/python2.7/plat-linux2/DLFCN.pyc
dlopen("/usr/lib/pymodules/python2.7/OpenSSL/crypto.so", 102);
import OpenSSL.crypto # dynamically loaded from /usr/lib/pymodules/python2.7/OpenSSL/crypto.so
dlopen("/usr/lib/pymodules/python2.7/OpenSSL/rand.so", 2);
import OpenSSL.rand # dynamically loaded from /usr/lib/pymodules/python2.7/OpenSSL/rand.so
dlopen("/usr/lib/pymodules/python2.7/OpenSSL/SSL.so", 2);
import OpenSSL.SSL # dynamically loaded from /usr/lib/pymodules/python2.7/OpenSSL/SSL.so
# /usr/lib/pymodules/python2.7/OpenSSL/version.pyc matches /usr/lib/pymodules/python2.7/OpenSSL/version.py
import OpenSSL.version # precompiled from /usr/lib/pymodules/python2.7/OpenSSL/version.pyc

这是此处引用的文件的SHA1:

user@beeplus /usr/lib/pymodules/python2.7/OpenSSL $ shasum *
46ef76e58b652dc3a604299a9a7af1e46f6b2d0b  crypto.so
775a319724acbfbb10bd708e35178fa72d9afcc1  __init__.py
b69a3f5e97fc540bc05eb1f25d115d2dff14327b  __init__.pyc
0c5742e81de0d00c3d135bf287aa057052a592f2  rand.so
f5c3532c6f5bef71f664b17be07e506152d7368c  SSL.so
shasum: test:
77e453b9076e9d17f0234097b737b87f08182a29  tsafe.py
aa605271b940aba6f538c0810ad616f5948eb868  tsafe.pyc
b1d283eb33e173e10703cac2140718efa88929e4  version.py
696e2c15eba578b0f305f1822a080379e4d26279  version.pyc

也许* .so文件在系统上丢失/错误?

编辑:看起来我的环境正在从与您不同的目录结构中加载。

这是“虚拟环境”:https : //virtualenv.pypa.io/en/latest/吗?如果是这样,那可能是造成差异的原因?老实说,我对Python如何管理它的库没有真正的了解-您需要Python专家才能提供!

另外(回答您对SHA1的评论)-我不记得是否必须安装特定的软件包才能获得“ shasum ”工具-显然这是Perl脚本。但是我猜想任何可以生成校验和的东西(甚至在推送时也可以执行'ls -l')。

最后一点信息,以防它帮助任何人缩小问题范围

$ uname -a
Linux beeplus 3.18.8+ #761 PREEMPT Fri Feb 27 15:43:30 GMT 2015 armv6l GNU/Linux

在说明中添加了我的版本信息。我和您有相同的openssl。
jrel 2015年

是的,搜索错误确实会产生一些结果,但是没有一个具有解决方案。
jrel 2015年

1
OpenSSL的导入似乎会触发库本身中的一系列其他导入-也许尝试一次一次导入它们,以缩小错误范围?我将编辑我的帖子以显示我的意思。
monojohnny

是的,看起来您快要死了。但是现在呢?
jrel 2015年

猜测这可能是Python的打包问题-可能在StackOverFlow主站点上与Python标记的帖子交叉发布-看看是否有Python专家可以提供帮助。
monojohnny

1

我在Pi(B)上有一个非常相似的问题。

import OpenSSL导致完全相同的错误响应。运行pip list显示pyOpenSSL为v 0.14。

用尽所有其他想法后,我使用删除了pyOpenSSL sudo pip uninstall pyOpenSSL

pip list然后显示pyOpenSSL为v0.13。我做了sudo pip uninstall pyOpenSSL2或3次以上,但pip list仍然显示pyOpenSSL(0.13)

然后我发现import OpenSSL并没有像以前那样显示问题。我一直在进行故障排除的最初问题也消失了。

希望这可以帮助。


0

在Pi2B上没问题。

paul /ram $ sudo apt-get install openssl
Reading package lists... Done
Building dependency tree       
Reading state information... Done
openssl is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
paul /ram $ sudo apt-get install python-openssl
Reading package lists... Done
Building dependency tree       
Reading state information... Done
python-openssl is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
paul /ram $ python
Python 2.7.3 (default, Mar 18 2014, 05:13:23) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import OpenSSL
>>> 
paul /ram $ pydoc OpenSSL

Help on package OpenSSL:

NAME
    OpenSSL - pyOpenSSL - A simple wrapper around the OpenSSL library

FILE
    /usr/lib/pymodules/python2.7/OpenSSL/__init__.py

PACKAGE CONTENTS
    SSL
    crypto
    rand
    test (package)
    tsafe
    version

DATA
    __all__ = ['rand', 'crypto', 'SSL', 'tsafe', '__version__']
    __version__ = '0.13'

VERSION
    0.13
:

0

这对我有用!

rm -rf /usr/local/lib/python2.7/dist-packages/fabric/fabric-home-assistant

sudo apt-get install libffi-dev libssl-dev

sudo pip install cryptography --force-reinstall
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.