Python AttributeError:' module'对象没有属性' SSL_ST_INIT'

时间:2017-04-06 23:10:28

标签: python openssl pyopenssl

我的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'

21 个答案:

答案 0 :(得分:108)

Upgrading pyopenssl with pip was not working as none of the commands related to to pip was working for me. By upgrading pyopenssl with easy_install, above problem can be solved.

sudo python -m easy_install --upgrade pyOpenSSL

credit @delimiter (Answer)

答案 1 :(得分:70)

原来问题在于我安装了pyOpenSSL,pyOpenSSL-0.15.1。

我做了:

pip uninstall pyopenssl

然后

pip install pyopenssl

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

答案 2 :(得分:13)

更新您的pyopenssl模块:

$ sudo pip install -U pyopenssl

答案 3 :(得分:9)

我最近遇到了同样的问题,经过几个小时的调查后,我发现它是由新的加密2.0 升级引起的。此升级将使用pyopenssl(如Sentry,Google Analytics等)打破许多软件包。只需将其降级到1.9即可解决问题。

如果您使用“pip install -U”,请务必小心,它会自动升级requirements.txt中未列出的软件包。

答案 4 :(得分:8)

我有一个类似的错误:

    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

一切都是肉汁。

答案 5 :(得分:3)

在我的情况下,问题是该软件包安装在 root 目录中,而我正在执行使用我的Linux用户 forvas要求pyopenssl的脚本。该用户无法使用root中安装的库。

首先,我必须使用aptitudeapt-get删除包。

sudo aptitude purge python-openssl

因此,我不得不再次安装软件包,但要考虑正在执行要求库的脚本的用户。根据Linux用户和--user的参数pip,查看库的安装位置。

案例1

forvas@server:$ pip install pyopenssl
  

由于EnvironmentError导致无法安装软件包:

     

[Errno 13]权限被拒绝:'/ usr / local / lib / python2.7 / did-package / OpenSSL'

     

考虑使用--user选项或检查权限。

案例2

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

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

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

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 执行脚本时,我能够使用 2 4 <选项正确地重新安装软件包/ strong>(其中库可供所有Linux用户使用)或更准确,选项 3 (其中库仅适用于Linux用户 forvas )。< / p>

答案 6 :(得分:3)

我这样做是有帮助的:

$ easy_install -U pip $ easy_install -U pyOpenSSL

答案 7 :(得分:2)

我的问题是由- 30 D 138 P 21 中的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 删除了它。然后,我运行以下命令安装pip的发行版。

sudo apt-get remove python-openssl

curl -o ./get-pip.py https://bootstrap.pypa.io/get-pip.py sudo python2 ./get-pip.py 现在显示:

pip --version

然后,我能够执行我想要完成的必要的pip安装。

答案 8 :(得分:2)

这对我有用:

sudo apt remove python-openssl

答案 9 :(得分:2)

我在MacOS上通过brew安装了python 2和3时遇到了这个问题。事实证明,brew uninstall对python和python @ 2的使用不会删除为这些python版本安装的任何库。即:

/usr/local/lib/python3.7/site-packages/
/usr/local/lib/python2.7/site-packages/

里面的东西不对,所以对我有用的是删除/移动brew的python 2和3的所有已安装的库,然后重新启动(并确保仅从这里开始使用virtualenvs):

brew uninstall --ignore-dependencies python@2
brew uninstall --ignore-dependencies python
sudo mv /usr/local/lib/python3.7 ~/python3.7libs-backup
sudo mv /usr/local/lib/python2.7 ~/python2.7libs-backup
brew install python
brew install python@2

答案 10 :(得分:1)

就我而言,它在卸载和升级时抛出了同样的错误。我无法卸载或升级。

AttributeError: 'module' object has no attribute 'SSL_ST_INIT'

以下为我工作。

# rm -rf /usr/lib/python2.7/site-packages/OpenSSL/
# rm -rf /usr/lib/python2.7/site-packages/pyOpenSSL-16.1.0.dist-info
# rm -rf /usr/lib/python2.7/site-packages/pyOpenSSL-18.0.0-py2.7.egg
# pip2.7 install pyopenssl
Collecting pyopenssl
Downloading 
.
.
100% |████████████████████████████████| 61kB 5.8MB/s 
Collecting cryptography>=2.2.1 (from pyopenssl)
.
.
Installing collected packages: cryptography, pyopenssl
Found existing installation: cryptography 1.7.2
Uninstalling cryptography-1.7.2:
  Successfully uninstalled cryptography-1.7.2
Successfully installed cryptography-2.2.2 pyopenssl-18.0.0

警告:仅在升级(sudo pip install pyOpenSSL==16.2.0)或卸载(pip uninstall pyopenssl)无效

时尝试此操作

答案 11 :(得分:1)

当我尝试使用ssh进入虚拟机时,我在Ubuntu 16.04虚拟机的控制台上看到类似的 python堆栈转储。

    SSL_ST_INIT = _lib.SSL_ST_INIT
AttributeError: 'module' object has no attribute 'SSL_ST_INIT'

Pip报告说没有安装pyopenssl。

我不得不这样做:

$ apt install --reinstall python-openssl

答案 12 :(得分:1)

在其他解决方案对我不起作用之后,我的解决方案变得更加简单。我尝试通过pip安装/卸载的任何内容都返回了相同的错误和stacktrace。

我最终尝试通过pip3更新pip,并且它运行正常:

pip3 install --upgrade pip

我回到使用pip的方法,一切正常。我确实注意到,虽然运行pip命令时它正在引用Python 3.6。

# pip install pyopenssl`enter code here`
Requirement already satisfied: pyopenssl in /usr/lib64/python3.6/site-packages (18.0.0)

<snipped>

Requirement already satisfied: pycparser in /usr/lib64/python3.6/site-packages (from cffi!=1.11.3,>=1.7->cryptography>=2.2.1->pyopenssl) (2.19)

答案 13 :(得分:1)

我在Ubuntu 16.04上遇到了同样的问题,但是有以下几点:当virtualenv被激活时(. venv/bin/activate在运行芹菜工作者之前使用pysolr,请求等等) - 一切都运行得很好,但是当我使用完整路径和python路径从命令行运行芹菜 - 出现问题(从supervisord运行同样的问题)。此外,如果重要的话,virtualenv已经在机器的其他地方与相同的Ubuntu版本捆绑在一起。

解决方案很简单:向PATH添加/full/path/to/venv/bin(这里建议https://serverfault.com/questions/331027/supervisord-how-to-append-to-path)解决了这个问题。

不幸的是,我还没有指出导致这种情况的更新,但希望这可能有助于某人。

答案 14 :(得分:0)

以防万一其他人找不到正确的方法来完成这项工作,截至2018年11月,对我有用的是:

sudo rm -rf /usr/local/lib/python2.7/dist-packages/OpenSSL/ sudo apt install --reinstall python-openssl

祝你好运!

答案 15 :(得分:0)

我刚刚在Ubuntu 16.04主机上遇到了这个问题。在python-openssl和python-crypotgraphy的apt repo软件包与有人通过pip手动安装到/usr/local/python2.7/dist-packages中的软件包之间似乎存在版本冲突。

一旦进入此状态,系统标准pip也将无法执行。我通过手动设置一个PYTHONPATH环境变量来解决鸡和蛋的问题,这样就排除了树的/ usr / local部分:

    $ export PYTHONPATH="/usr/lib/python2.7:/usr/lib/python2.7/plat-x86_64-linux-gnu:/usr/lib/python2.7/lib-tk:/usr/lib/python2.7/lib-old:/usr/lib/python2.7/lib-dynload:/usr/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages/gtk-2.0"
    $ /usr/bin/pip uninstall cryptography
    $ unset PYTHONPATH

我获得了上面与python shell一起使用的库目录列表:

    import sys
    for p in sys.path:
       print(p)

,然后复制列出的所有内容(一个/ usr / local目录除外)。您的系统路径中可能有其他列表。进行相应的调整。

我在bash历史记录中还散布了一些手动apt-get install --reinstall python-openssl python-cryptography命令,这些命令可能是必需的,也可能不是必需的。

答案 16 :(得分:0)

export PYTHONPATH =“ / usr / lib / python2.7:/usr/lib/python2.7/plat-x86_64-linux-gnu:/usr/lib/python2.7/lib-tk:/ usr / lib /python2.7/lib-old:/usr/lib/python2.7/lib-dynload:/usr/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages/gtk- 2.0“ apt-get install-重新安装python-openssl

答案 17 :(得分:0)

我遇到了同样的问题,并且由于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

此后,一切都按预期进行。

答案 18 :(得分:0)

我也看到了AttributeError: 'module' object has no attribute 'SSL_ST_INIT'错误。

否则

sudo pip install pyOpenSSL==16.2.0

为我解决了。

答案 19 :(得分:0)

这是一篇较旧的文章,所以我的回答是希望在2019年末帮助某人...我的问题与Python 2 vs 3有关。我仅在使用Python 3;不再使用旧版Python。但是我的操作系统(例如Ubuntu 16.04)仍然安装了Python 2.7。因此,在默认情况下(例如,不在virtualenv中)运行全局pip时,我正在调用pip的Python 2版本。

对我来说,我使用以下方法解决了此问题。

卸载docker-compose

sudo pip3 uninstall docker-compose  
sudo pip uninstall docker-compose

为我的Python版本重新安装docker-compose

sudo pip3 install docker-compose

答案 20 :(得分:0)

我正在运行 OSX 10.15.5 Catalina 并使用 pyenv。

在此页面上尝试了许多其他解决方案后,对我有用的是:

pyenv uninstall 3.6.8
pyenv install 3.6.8

我不得不承认我不确定为什么这能解决这个问题,因为我最近才安装了这个版本的 Python。