web-dev-qa-db-de.com

Python AttributeError: 'Modul'-Objekt hat kein Attribut' SSL_ST_INIT '

Ein Python-Skript von mir schlägt fehl mit:

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

Es stellte sich heraus, dass das Problem bei meiner Installation von pyOpenSSL, pyOpenSSL-0.15.1, bestand.

Ich tat:

pip uninstall pyopenssl

und dann

pip install pyopenssl

... und mein Python-Skript hat wieder funktioniert!

68
Ben Wheeler

Das Upgrade von pyopenssl mit pip funktionierte nicht, da keiner der Befehle, die sich auf pip bezogen, für mich funktionierte. Durch ein Upgrade von pyopenssl mit easy_install kann das obige Problem gelöst werden.

Sudo python -m easy_install --upgrade pyOpenSSL

credit @delimiter ( Antwort )

90
Muhammad Hassan

Aktualisieren Sie Ihr pyopenssl-Modul:

$ Sudo pip install -U pyopenssl
13
user197292

Ich habe das gleiche Problem kürzlich erlebt und nach einigen Stunden Untersuchung fand ich heraus, dass es durch New Cryptography 2.0 upgrade verursacht wurde. Dieses Upgrade zerstört viele Pakete, die pyopenssl verwenden (wie Sentry, Google Analytics usw.). Ein Downgrade auf 1.9 wird das Problem lösen.

Seien Sie vorsichtig, wenn Sie "pip install -U" verwenden. Es werden automatisch Pakete aktualisiert, die nicht in der Anforderungen.txt aufgeführt sind.

8
Fei Xie

Ich hatte einen ähnlichen Fehler:

    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'

und keine der anderen Antworten konnte das Problem beheben, da pip nichts installieren konnte. Stattdessen habe ich zuerst das vom Terminal aus gemacht:

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

Dann pyopenssl mit pip neu installiert:

Sudo pip install pyopenssl

und alles war Soße.

6
wordsforthewise

Ich habe das gemacht, was geholfen hat:

$ easy_install -U pip $ easy_install -U pyOpenSSL

2
felix021

Mein Problem wurde durch die Version von Python openssl verursacht, die sich in /usr/lib/python2.7/dist-packages/ befand.

dpkg -l | grep openssl zeigte:

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

Ich habe es mit Sudo apt-get remove python-openssl entfernt. Ich habe dann folgendes ausgeführt, um die Distributionsversion von pip zu installieren.

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

pip --version zeigt jetzt an:

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

Ich konnte dann die notwendige Pip-Installation durchführen, die ich abzuschließen versuchte.

2
HeatfanJohn

In meinem Fall bestand das Problem darin, dass das Paket in den Verzeichnissen root installiert wurde und ich das Skript ausführte, das nach pyopenssl mit meinem Linux-Benutzer forvas gefragt wurde. Dieser Benutzer kann die in root installierten Bibliotheken nicht verwenden.

Also musste ich zuerst das Paket mit aptitude oder apt-get entfernen.

Sudo aptitude purge python-openssl

Daher musste ich das Paket erneut installieren, jedoch unter Berücksichtigung des Benutzers, der das Skript ausführt, das die Bibliothek anfordert. Schauen Sie sich an, wo die Bibliothek installiert ist, abhängig vom Linux-Benutzer und dem Argument --user von pip.

Fall 1

[email protected]:$ pip install pyopenssl

Pakete konnten aufgrund eines EnvironmentError nicht installiert werden:

[Errno 13] Berechtigung abgelehnt: '/usr/local/lib/python2.7/dist-packages/OpenSSL'

Erwägen Sie die Verwendung der Option --user oder überprüfen Sie die Berechtigungen.

Fall 2

[email protected]:$ 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/*

Fall 3

[email protected]:$ 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/*

Fall 4

[email protected]:$ pip install pyopenssl

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

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

Fall 5

[email protected]:$ 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/*

Fazit

Mein Problem war, dass die Bibliothek in den Verzeichnissen des Falls 5 installiert wurde.

Lösung

  • Deinstallation des Pakets.

  • Da ich das Skript mit dem Linux-Benutzer forvas ausführte, konnte ich das Paket mit den Optionen 2 oder 4 (in denen die Bibliothek für alle Linux-Benutzer verfügbar ist) richtig neu installieren. oder genauer die Option 3 (in der die Bibliothek nur für den Linux-Benutzer forvas verfügbar ist).

2
forvas

Meine Lösung war viel einfacher, nachdem diese anderen Lösungen für mich nicht funktionierten. Alles, was ich über Pip installieren/deinstallieren wollte, gab den gleichen Fehler und Stacktrace zurück.

Ich habe letztendlich versucht, Pip über Pip3 zu aktualisieren, und es hat einwandfrei funktioniert:

pip3 install --upgrade pip 

Ich habe wieder Pip benutzt und alles hat richtig funktioniert. Ich bemerkte zwar, dass Python 3.6 verwiesen wurde, obwohl die pip-Befehle ausgeführt wurden.

# 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

Ich hatte das gleiche Problem auf Ubuntu 16.04, aber mit der folgenden Wendung: Als virtualenv aktiviert wurde (. venv/bin/activate, bevor Selleriearbeiter mit pysolr, Anfragen usw. in meinem Fall ausgeführt wurden) - alles hat perfekt funktioniert, aber als ich Sellerie von der Kommandozeile mit full ausgeführt habe Pfade und Python-Pfade - es gab ein Problem (und dasselbe Problem, das von Supervisord ausgeführt wird). Wenn es wichtig ist, wurde virtualenv an anderer Stelle auf der Maschine mit derselben Ubuntu-Version gebündelt.

Lösung war einfach: Durch Hinzufügen von /full/path/to/venv/bin zu PATH (wie hier angegeben https://serverfault.com/questions/331027/supervisord-how-to-append-to-path ) wurde dieses Problem gelöst.

Leider habe ich noch nicht genau festgestellt, was für ein Update dies verursacht hat, aber hoffentlich kann dies jemandem helfen.

1
Roman Susi

Ich sah ähnliche python stack dump auf der Konsole meines Ubuntu 16.04 VM, als ich ssh in die VM einprobierte.

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

Pip berichtet, dass pyopenssl nicht installiert wurde.

Ich musste das stattdessen tun:

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

Ich hatte dieses Problem auf MacOS mit Python 2 und 3 via Brew installiert. Es stellt sich heraus, dass brew uninstalling python und python @ 2 keine Bibliotheken entfernt, die für diese Python-Versionen installiert wurden. in:

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

Irgendetwas war nicht richtig. Also funktionierte es für mich, alle installierten Bibliotheken für Brew's Python 2 und 3 zu löschen bzw. zu verschieben und neu zu starten (und von hier an nur Virtualenvs zu verwenden):

brew uninstall --ignore-dependencies [email protected]
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 [email protected]
0
Fiskabollen

In meinem Fall wurde derselbe Fehler beim Deinstallieren und Aktualisieren ausgegeben. Ich konnte nicht deinstallieren oder aktualisieren. 

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

Folgendes arbeitete für mich. 

# 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: Versuchen Sie dies nur, wenn ein Upgrade (Sudo pip install pyOpenSSL==16.2.0) oder Deinstallieren (pip uninstall pyopenssl) nicht hilft 

0
f-society

Ich habe auch den AttributeError: 'module' object has no attribute 'SSL_ST_INIT'-Fehler gesehen.

Tun

Sudo pip install pyOpenSSL==16.2.0

hat es für mich gelöst.

0
Vikram Hosakote

Ich hatte das gleiche Problem und als pip nicht mehr funktionierte, musste ich seine Arbeit manuell erledigen:

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

Danach funktionierte alles wie erwartet.

0
Delaballe

Nur für den Fall, dass jemand anderes nicht genau die richtigen Beschwörungen findet, um diese Funktion zum Laufen zu bringen. Ab November 2018 war das, was für mich funktionierte:

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

Viel Glück!

0
brianpgerson

Ich bin gerade auf meinem Ubuntu 16.04 Host darauf gestoßen. Es scheint einen Versionskonflikt zwischen den apt-Repo-Paketen für python-openssl und python-crypotgraphy zu geben, verglichen mit dem, was jemand manuell mit pip in /usr/local/python2.7/dist-packages installiert hat.

Sobald dieser Zustand erreicht wurde, konnte der Standardpip des Systems ebenfalls nicht ausgeführt werden. Ich habe das Problem "Chicken-and-Egg" umgangen, indem ich manuell eine PYTHONPATH-Umgebungsvariable gesetzt habe, die den/usr/local-Teil des Baums so ausschließt:

    $ 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

Ich habe die obige Liste der Bibliotheksverzeichnisse erworben, die mit der Python-Shell verwendet werden sollen:

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

und kopiert dann alles, außer dem Verzeichnis/usr/local. Ihr System hat möglicherweise eine andere Liste im Pfad. Dementsprechend anpassen.

Ich hatte auch einige apt-get install --reinstall python-openssl python-cryptography-Befehle in der Bash-Historie, die möglicherweise nicht unbedingt erforderlich waren.

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