Python AttributeError: 'module' object has no attribute 'SSL_ST_INIT' Python属性错误:'模块'对象没有属性'SSL_ST_INIT'

86

我的一个Python脚本出现了错误:

Traceback (most recent call last):
  File "./inspect_sheet.py", line 21, in <module>
    main()
  File "./inspect_sheet.py", line 12, in main
    workbook_name=workbook_name,
  File "./google_sheets.py", line 56, in __init__
    self.login()
  File "./google_sheets.py", line 46, in login
    self.client = gspread.authorize(credentials)
  File "/usr/local/lib/python2.7/site-packages/gspread/client.py", line 335, in authorize
    client.login()
  File "/usr/local/lib/python2.7/site-packages/gspread/client.py", line 98, in login
    self.auth.refresh(http)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 598, in refresh
    self._refresh(http.request)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 769, in _refresh
    self._do_refresh_request(http_request)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 795, in _do_refresh_request
    body = self._generate_refresh_request_body()
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 1425, in _generate_refresh_request_body
    assertion = self._generate_assertion()
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 1554, in _generate_assertion
    private_key, self.private_key_password), payload)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/crypt.py", line 162, in from_string
    from OpenSSL import crypto
  File "/usr/local/lib/python2.7/site-packages/OpenSSL/__init__.py", line 8, in <module>
    from OpenSSL import rand, crypto, SSL
  File "/usr/local/lib/python2.7/site-packages/OpenSSL/SSL.py", line 118, in <module>
    SSL_ST_INIT = _lib.SSL_ST_INIT
AttributeError: 'module' object has no attribute 'SSL_ST_INIT'

我在Debian-Jessie中遇到了这个问题,升级的软件包python-openssl(16.0.0-1~bpo8+1)也无法正常工作,因此我不得不按照下面的解决方案使用pip进行升级(使用的版本是18.0.0)。 - iuridiniz
23个回答

167

使用pip升级pyopenssl时,与pip相关的任何命令都无法正常工作。通过使用easy_install升级pyopenssl,可以解决上述问题。

sudo python -m easy_install --upgrade pyOpenSSL

来源@delimiter (答案)


2
谢谢!在执行这个命令后,我不得不重新启动我的终端/重新登录到我的服务器,之后pip就正常工作了。 - Jarvis Johnson
遇到了新的错误 - 错误:安装脚本退出并显示错误:命令'gcc'执行失败,退出状态为1。 - brainLoop
这可能有所帮助,但即使注销并重新登录,我仍然在OP中遇到AttributeError - Adrian Keister
这个有效!它为我解决了OpenSSL错误(模块“lib”没有属性“X509_V_FLAG_CB_ISSUER_CHECK”)。 - Abeer Sul

93

结果发现问题出在我安装的pyOpenSSL-0.15.1上。

我进行了以下操作:

pip uninstall pyopenssl

然后

pip install pyopenssl

...我的Python脚本再次正常运行了!


36
我遇到了运行 pip 命令的问题,通过运行 sudo easy_install pyOpenSSL 命令来解决。 - chinmay
2
刚刚升级了加密技术;你的解决方案在我的情况下已经足够了。 - Jesper - jtk.eth
4
在我的情况下,我必须这样卸载:sudo aptitude purge python-openssl,因为它是通过aptitude安装的。我认为我可以使用apt-get做同样的事情。 - ChesuCR
2
每次运行 pip 都会出现错误。所以我运行了 rm -rf cryptography,然后就可以再次运行 pip 了。 - John Strood
1
这个问题阻止了我成功运行pip。因此,在遵循Ben的指示之前,我不得不从lib/python2.7/site-packages中删除cryptography。 - Milad M
显示剩余2条评论

19

更新您的 pyopenssl 模块:

$ sudo pip install -U pyopenssl

1
谢谢,我认为这比卸载和重新安装更有效率。 - Ben Wheeler
2
如果您使用virtualenv,则不需要sudo。 - Chris

18

我遇到了类似的错误:

    from OpenSSL import rand, crypto, SSL
  File "/usr/local/lib/python3.5/dist-packages/OpenSSL/SSL.py", line 112, in <module>
    SSL_ST_INIT = _lib.SSL_ST_INIT
AttributeError: module 'lib' has no attribute 'SSL_ST_INIT'

其他的回答都不能解决问题,因为pip无法安装任何东西。相反,我首先从终端执行了以下操作:

sudo rm -r /usr/local/lib/python3.5/dist-packages/OpenSSL

然后用pip重新安装了pyopenssl:

sudo pip install pyopenssl

一切都很顺利。


2
值得注意的是:如果您使用virtualenv,则可能需要删除rm -r ~/.virtualenvs/YourEnv/local/lib/python3.6/site-packages/OpenSSL - warcholprzemo

13

请使用以下命令进行尝试:

easy_install -U pip
easy_install -U pyOpenSSL

9
我最近也遇到了同样的问题,在经过几个小时的调查后,我发现这是由于新的加密 2.0升级引起的。这个升级将会破坏许多使用pyopenssl的软件包(如Sentry、Google Analytics等)。只需将其降级到1.9即可解决问题。
如果您使用的是"pip install -U",请注意它会自动升级未在requirements.txt中列出的软件包。

谢谢,这个方法有效。对我来说,升级pyopenssl并不足够。 - r11

5
在我的情况下,问题在于软件包被安装在根目录中,而我正在使用Linux用户forvas执行脚本,该脚本需要pyopenssl。但是该用户无法使用在根目录安装的库。
因此,首先我必须使用aptitudeapt-get删除软件包。
sudo aptitude purge python-openssl

因此,我不得不再次安装该软件包,但要考虑执行脚本的用户,该脚本正在请求库。根据Linux用户和pip--user参数,请查看库安装的位置。 情况1
forvas@server:$ pip install pyopenssl

由于环境错误,无法安装软件包: [Errno 13] 权限被拒绝:'/usr/local/lib/python2.7/dist-packages/OpenSSL' 请考虑使用“--user”选项或检查权限。
forvas@server:$ sudo pip install pyopenssl

/usr/local/lib/python2.7/dist-packages/OpenSSL/*

/usr/local/lib/python2.7/dist-packages/pyOpenSSL-17.5.0.dist-info/*

案例 3

以上路径指向的是Python中关于OpenSSL的库文件和版本信息。
forvas@server:$ sudo pip install --user pyopenssl

/home/forvas/.local/lib/python2.7/site-packages/OpenSSL/*

/home/forvas/.local/lib/python2.7/site-packages/pyOpenSSL-17.5.0.dist-info/*

案例4

以上路径是针对Python 2.7版本安装的OpenSSL和pyOpenSSL-17.5.0的组件所在目录。
root@server:$ pip install pyopenssl

/usr/local/lib/python2.7/dist-packages/OpenSSL/*

/usr/local/lib/python2.7/dist-packages/pyOpenSSL-17.5.0.dist-info/*

案例 5

这是两个文件路径,它们与Python的OpenSSL库有关。如果你需要在Python中使用OpenSSL库,那么这些文件路径可能会对你有用。

root@server:$ pip install --user pyopenssl

/root/.local/lib/python2.7/site-packages/OpenSSL/*

/root/.local/lib/python2.7/site-packages/pyOpenSSL-17.5.0.dist-info/*

结论

我的问题在于该库被安装在第 5 种情况下的目录中。

解决方案

  • 卸载软件包。

  • 由于我是用 Linux 用户 forvas 执行脚本,所以我可以选择使用选项 24(其中库对所有 Linux 用户可用),或更精确地使用选项 3(其中库仅对 Linux 用户 forvas 可用)正确地重新安装软件包。


这对于Python 3会是什么样子? - Adrian Keister
按照这个例子,例如第3种情况是 sudo python3 -m pip install --user pyopenssl,并且包将存储在 /home/forvas/.local/lib/python3.6/site-packages 中。 - forvas

5

我曾经遇到过同样的问题,由于pip不再起作用,我不得不手动执行以下步骤:

wget https://files.pythonhosted.org/packages/40/d0/8efd61531f338a89b4efa48fcf1972d870d2b67a7aea9dcf70783c8464dc/pyOpenSSL-19.0.0.tar.gz
tar -xzvf pyOpenSSL-19.0.0.tar.gz
cd pyOpenSSL-19.0.0
sudo python setup.py install

之后一切都按预期工作。


3
我的问题是由于Python OpenSSL的版本在/usr/lib/python2.7/dist-packages/中引起的。

dpkg -l | grep openssl显示:

ii  python-openssl                                0.15.1-2build1                               all          Python 2 wrapper around the OpenSSL library

我使用sudo apt-get remove python-openssl删除了它。接下来,我运行以下命令安装分发版本的pip。

curl -o ./get-pip.py https://bootstrap.pypa.io/get-pip.py
sudo python2 ./get-pip.py

pip --version现在显示:

pip 18.0 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7)

我随后能够执行所需的pip install,这是我试图完成的任务。


1
谢谢@heatfanjohn。我和你一样处于完全相同的情况,它按照你所写的方式运行! - icasimpan

3
这对我有效:
```

这对我有效:

```
sudo apt remove python-openssl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接