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'
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é!
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 )
Mettez à jour votre module pyopenssl
:
$ Sudo pip install -U pyopenssl
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.
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.
J'ai fait ça qui a aidé:
$ easy_install -U pip
$ easy_install -U pyOpenSSL
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.
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).
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)
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.
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
J'ai eu ce problème sur MacOS avec Python 2 et 3 installés via Brew. brew uninstall
ing 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
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.
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.
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.
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!
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.
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