Python AttributeError:“模块”对象没有属性“ SSL_ST_INIT”


79

我的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从jessie-backports升级的软件包 (16.0.0-1〜bpo8 + 1)也不起作用,因此我必须根据解决方案使用pip对其进行升级(旧版本为18.0) .0)
iuridiniz

Answers:


157

pyopenssl使用pip升级无法正常工作,因为与之相关的命令pip都对我不起作用。通过升级pyopenssl使用easy_install,上述问题就可以迎刃而解。

sudo python -m easy_install --upgrade pyOpenSSL

信用@delimiter(回答


2
谢谢!在执行此命令pip后,我必须重新启动终端/重新登录到服务器,然后运行良好。
贾维斯·约翰逊

遇到新的错误-错误:安装脚本退出并出现错误:命令'gcc'失败,退出状态为1
brainLoop

这可能很有帮助,但是即使注销并再次登录,我仍然可以AttributeError进入OP。
阿德里安·基斯特

79

原来问题出在我的pyOpenSSL,pyOpenSSL-0.15.1安装上。

我做了:

pip uninstall pyopenssl

然后

pip install pyopenssl

...然后我的Python脚本再次起作用了!


35
我无法pip自行运行,这解决了它sudo easy_install pyOpenSSL
chinmay,2017年

2
刚刚升级了密码;对于我而言,您的解决方案就足够了
denvar '17

3
在我的情况下,我必须像这样卸载:sudo aptitude purge python-openssl因为它是用安装的aptitude。我想我可以用apt-get
ChesuCR '18年

2
每次我跑错了pip。也是rm -rf cryptography,可以再次运行点子。
John Strood '18

1
这个问题使我无法成功运行pip。因此,在按照Ben的指示进行操作之前,我必须从lib / python2.7 / site-packages中删除加密。
Milad M

17

更新您的pyopenssl模块:

$ sudo pip install -U pyopenssl

1
谢谢,我认为这比再次卸载和安装更为有效。
本·惠勒

1
如果您使用virtualenv,则不需要sudo。
克里斯,

15

我有一个类似的错误:

    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

一切都是肉汁


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

11

尝试使用以下命令:

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

就我而言,问题是该软件包安装在目录中,并且我正在执行pyopenssl我的Linux用户forvas要求的脚本。该用户不能使用安装在根目录下的库。

因此,首先我必须使用aptitude或删除软件包apt-get

sudo aptitude purge python-openssl

因此,我不得不再次安装该软件包,但要考虑执行脚本的用户,该脚本正在请求该库。看看到库随Linux用户和参数安装位置--userpip

情况1

forvas@server:$ pip install pyopenssl

由于EnvironmentError无法安装软件包:

[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

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执行脚本时,我能够使用选项24(其中所有库的Linux用户都可以使用该库)正确或更正确地使用选项3(其中的库为仅适用于Linux用户forvas)。


Python 3的外观如何?
阿德里安·基斯特

在此示例之后,例如情况3将是sudo python3 -m pip install --user pyopenssl,并且包将存储在中/home/forvas/.local/lib/python3.6/site-packages

4

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

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


1
谢谢@heatfanjohn。我和你的处境完全一样,它按你写的来工作!
icasimpan



2

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

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

祝好运!


2

我在MacOS上通过brew安装了python 2和3时遇到了这个问题。事实证明,brew uninstalling 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

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)无法解决问题时,才尝试此操作


1

我在Ubuntu 16.04上遇到了相同的问题,但有以下不同之处:激活virtualenv时(. venv/bin/activate在以pysolr,请求运行celery worker的情况下)–一切正常,但是当我使用完整路径从命令行运行celery时和python路径-出现了问题(并且从超级用户运行同样的问题)。另外,如果重要的话,virtualenv已与相同的Ubuntu版本捆绑在计算机上的其他位置。

解决方案很简单:添加/full/path/to/venv/bin到PATH(如此处建议/server/331027/supervisord-how-to-append-to-path所示)即可解决此问题。

不幸的是,我还没有指出导致这种情况的哪种更新,但是希望这可以对某人有所帮助。


1

我刚在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目录除外)。您的系统路径中可能有其他列表。相应地调整。

我的apt-get install --reinstall python-openssl python-cryptographybash历史记录中还散布了一些手动命令,这些命令可能有必要也可能没有必要。


1

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

我最终尝试通过pip3更新pip,它完美地工作了:

pip3 install --upgrade 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)

1

尝试:

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"
sudo apt-get install --reinstall python-openssl

1

当我尝试将ssh插入VM时,在Ubuntu 16.04 VM的控制台上看到类似的python堆栈转储。

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

pip报告pyopenssl未安装。

我不得不这样做:

sudo apt install --reinstall python-openssl

0

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

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

卸载docker-compose

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

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

sudo pip3 install docker-compose
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.