web-dev-qa-db-fra.com

Python AttributeError: l'objet 'module' n'a pas d'attribut 'SSL_ST_INIT'

Un de mes scripts Python échoue avec:

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'
50
Ben Wheeler

Il s'est avéré que le problème était lié à l'installation de pyOpenSSL, pyOpenSSL-0.15.1.

J'ai fait:

pip uninstall pyopenssl

et alors

pip install pyopenssl

... et mon script Python a encore fonctionné!

68
Ben Wheeler

La mise à niveau de pyopenssl avec pip ne fonctionnait pas, aucune des commandes associées à pip ne fonctionnant pour moi. En mettant à jour pyopenssl avec easy_install, le problème ci-dessus peut être résolu.

Sudo python -m easy_install --upgrade pyOpenSSL

credit @delimiter ( réponse )

90
Muhammad Hassan

Mettez à jour votre module pyopenssl:

$ Sudo pip install -U pyopenssl
13
user197292

J'ai eu le même problème récemment et après quelques heures d'enquête, j'ai découvert qu'il était causé par New cryptography 2.0 upgrade. Cette mise à niveau supprimera de nombreux paquets utilisant pyopenssl (tels que Sentry, Google Analytics, etc.). Il suffit de le rétrograder à 1.9 pour résoudre le problème.

Soyez prudent si vous utilisez "pip install -U", cela mettra automatiquement à jour les paquets qui ne sont pas listés dans Requirements.txt.

8
Fei Xie

J'ai eu une erreur similaire:

    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'

et aucune des autres réponses ne pourrait résoudre ce problème, car pip ne pouvait rien installer. Au lieu de cela, ce que j'ai fait était ceci depuis le terminal en premier:

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

Puis réinstallé pyopenssl avec pip:

Sudo pip install pyopenssl

et tout était en sauce.

6
wordsforthewise

J'ai fait ça qui a aidé:

$ easy_install -U pip $ easy_install -U pyOpenSSL

2
felix021

Mon problème était dû à la version de Python openssl qui était dans /usr/lib/python2.7/dist-packages/.

dpkg -l | grep openssl a montré:

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

Je l'ai enlevé en utilisant Sudo apt-get remove python-openssl. J'ai ensuite exécuté ce qui suit pour installer la version de distribution de pip.

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

pip --version affiche maintenant:

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

J'ai ensuite pu effectuer l'installation de pip nécessaire que j'essayais de terminer.

2
HeatfanJohn

Dans mon cas, le problème était que le paquet était installé dans les répertoires root et que j'exécutais le script qui demandait pyopenssl avec mon utilisateur Linux forvas. Et cet utilisateur ne peut pas utiliser les bibliothèques installées dans la racine.

Donc, je devais d'abord supprimer le paquet avec aptitude ou apt-get.

Sudo aptitude purge python-openssl

Par conséquent, j'ai dû réinstaller le paquet, mais en tenant compte de l'utilisateur qui exécute le script qui demande la bibliothèque. Regardez où la bibliothèque est installée en fonction de l'utilisateur Linux et de l'argument --user de pip.

Cas 1

forvas@server:$ pip install pyopenssl

Impossible d'installer les packages en raison d'une erreur EnvironmentError:

[Errno 13] Autorisation refusée: '/usr/local/lib/python2.7/dist-packages/OpenSSL'

Pensez à utiliser l'option --user ou vérifiez les autorisations.

Cas 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/*

Cas 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/*

Affaire 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/*

Cas 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/*

Conclusion

Mon problème était que la bibliothèque était installée dans les répertoires de l'affaire 5 .

Solution

  • Désinstallation du package.

  • Comme j'exécute le script avec l'utilisateur Linux forvas, j'ai pu réinstaller correctement le paquet avec les options 2 ou 4 (dans lequel la bibliothèque est disponible pour tous les utilisateurs Linux) ou plus précis, l'option 3 (dans laquelle la bibliothèque n'est disponible que pour l'utilisateur Linux forvas).

2
forvas

Ma solution était beaucoup plus simpliste après que ces autres solutions ne fonctionnaient pas pour moi. Tout ce que j'ai essayé d'installer/désinstaller via pip a renvoyé la même erreur et le même chemin de pile.

J'ai fini par essayer de mettre à jour pip via pip3 et cela a fonctionné parfaitement:

pip3 install --upgrade pip 

Je suis revenu à utiliser pip et tout a fonctionné correctement. J'ai toutefois remarqué qu'il faisait référence à Python 3.6 lors de l'exécution des commandes pip.

# 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
LesterCovax

J'ai eu le même problème sur Ubuntu 16.04, mais avec la torsion suivante: quand virtualenv a été activé (. venv/bin/activate avant de lancer les céleri-raves avec pysolr, les requêtes, etc. dans mon cas), tout a parfaitement fonctionné chemins et chemins python - il y avait un problème (et le même problème fonctionnant à partir de supervisord). De plus, si cela est important, virtualenv a été fourni ailleurs sur la machine avec la même version d'Ubuntu.

La solution était simple: ajouter /full/path/to/venv/bin à PATH (comme conseillé ici https://serverfault.com/questions/331027/supervisord-how-to-appo-tend-path ) a résolu ce problème.

Malheureusement, je n'ai pas encore identifié le type de mise à jour à l'origine de ce problème, mais j'espère que cela pourra aider quelqu'un.

1
Roman Susi

Je voyais similar python stack sur la console de mon Ubuntu 16.04 VM lorsque j'ai essayé de ssh sur la machine virtuelle.

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

Pip a signalé que pyopenssl n'était pas installé.

Je devais le faire à la place:

$ apt install --reinstall python-openssl
1
Deepak Mohanty

J'ai eu ce problème sur MacOS avec Python 2 et 3 installés via Brew. brew uninstalling python et python @ 2 ne suppriment aucune des bibliothèques installées pour ces versions de python; c'est-à-dire dans:

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

Quelque chose ne fonctionnait pas correctement, donc ce qui a fonctionné pour moi a été de supprimer/déplacer toutes les bibliothèques installées pour les pythons 2 et 3 de Brew et de recommencer (en veillant à utiliser uniquement virtualenvs à partir de maintenant):

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
0
Fiskabollen

Dans mon cas, la même erreur s'est produite pour la désinstallation et la mise à niveau. Je ne pouvais pas désinstaller ou mettre à niveau. 

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

La suite a fonctionné pour moi. 

# 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

WARNING: Essayez ceci uniquement si la mise à niveau (Sudo pip install pyOpenSSL==16.2.0) ou la désinstallation (pip uninstall pyopenssl) n'aide pas. 

0
f-society

J'ai vu l'erreur AttributeError: 'module' object has no attribute 'SSL_ST_INIT' aussi.

Faire

Sudo pip install pyOpenSSL==16.2.0

résolu pour moi.

0
Vikram Hosakote

J'avais le même problème et comme pip ne fonctionnait plus, je devais faire son travail manuellement:

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

Après cela, tout a fonctionné comme prévu.

0
Delaballe

Juste au cas où quelqu'un d'autre ne trouverait pas exactement les bonnes incantations pour que cela fonctionne, en novembre 2018, ce qui fonctionnait pour moi était:

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

Bonne chance!

0
brianpgerson

Je viens de rencontrer ceci sur mon hôte Ubuntu 16.04. Il semble y avoir un conflit de version entre les packages apt repo pour python-openssl et python-crypotgraphy, par rapport à ce que quelqu'un a installé manuellement avec pip dans /usr/local/python2.7/dist-packages.

Une fois dans cet état, le pip standard du système ne pouvait pas non plus s'exécuter. J'ai contourné le problème du poulet et des œufs en définissant manuellement une variable d'environnement PYTHONPATH qui excluait ainsi la partie/usr/locale de l'arbre:

    $ 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

J'ai acquis la liste ci-dessus de répertoires de bibliothèque à utiliser avec le shell Python:

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

puis en copiant tout ce qui est répertorié à l'exception du répertoire/usr/local. Votre système peut avoir une liste différente sur son chemin. Ajuste en accord.

J'avais aussi quelques commandes manuelles apt-get install --reinstall python-openssl python-cryptography dispersées dans mon historique bash, ce qui pouvait être nécessaire ou non.

0
Joi Owen

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 --reinstall python-openssl

0
YoungJeXu