Python AttributeError: Das Objekt 'module' hat kein Attribut 'SSL_ST_INIT'.


79

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'

Ich habe dieses Problem mit debian-jessie ausgeführt. Das aktualisierte Paket python-openssl(16.0.0-1 ~ bpo8 + 1) von jessie-backports funktioniert ebenfalls nicht. Daher muss ich es mit pip gemäß den folgenden Lösungen aktualisieren (verwendete Version war 18.0) .0)
iuridiniz

Antworten:


159

Das Upgrade pyopensslmit pip funktionierte nicht, da keiner der Befehle, auf die pipsich bezogen, für mich funktionierte. Durch ein Upgrade pyopensslmit easy_installkann das oben genannte Problem gelöst werden.

sudo python -m easy_install --upgrade pyOpenSSL

credit @delimiter ( Antwort )


2
Vielen Dank! Nach diesem Befehl musste ich mein Terminal / Log neu auf meinem Server starten und pipfunktionierte danach einwandfrei.
Jarvis Johnson

Treffen Sie den neuen Fehler - Fehler: Setup-Skript mit Fehler beendet: Befehl 'gcc' fehlgeschlagen mit Exit-Status 1
brainLoop

Dies ist wahrscheinlich hilfreich, aber selbst wenn ich mich abmelde und wieder anmelde, bekomme ich das immer noch AttributeErrorim OP.
Adrian Keister

80

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

Ich tat:

pip uninstall pyopenssl

und dann

pip install pyopenssl

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


35
Ich hatte Probleme pip, sudo easy_install pyOpenSSL
mich

2
Hatte gerade die Kryptographie aktualisiert; Ihre Lösung war in meinem Fall ausreichend
denvar

3
In meinem Fall musste ich so deinstallieren: sudo aptitude purge python-opensslweil es mit installiert wurde aptitude. Ich denke, ich könnte das gleiche tun mitapt-get
ChesuCR

2
Ich habe den Fehler jedes Mal erhalten, wenn ich lief pip. Das tat rm -rf cryptographyund konnte Pip wieder laufen lassen.
John Strood

1
Dieses Problem hat mich daran gehindert, pip erfolgreich auszuführen. Also musste ich die Kryptographie aus lib / python2.7 / site-packages entfernen, bevor ich Bens Anweisungen folgte.
Milad M

17

Aktualisieren Sie Ihr pyopensslModul:

$ sudo pip install -U pyopenssl

1
Vielen Dank, ich denke, das ist effizienter als das Deinstallieren und erneute Installieren.
Ben Wheeler

1
Wenn Sie eine virtuelle Umgebung verwenden, benötigen Sie kein Sudo.
Chris

15

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 dies zuerst vom Terminal aus getan:

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

Dann pyopenssl mit pip neu installieren:

sudo pip install pyopenssl

und alles war Soße.


1
Bemerkenswert: Wenn Sie virtualenv verwenden, müssen Sie wahrscheinlich entfernen rm -r ~/.virtualenvs/YourEnv/local/lib/python3.6/site-packages/OpenSSL
warcholprzemo

11

Versuchen Sie es mit den folgenden Befehlen:

easy_install -U pip
easy_install -U pyOpenSSL

9

Ich habe das gleiche Problem kürzlich festgestellt und nach einigen Stunden Untersuchung festgestellt, dass es durch das Upgrade von New Cryptography 2.0 verursacht wurde . Durch dieses Upgrade werden viele Pakete mit pyopenssl (wie Sentry, Google Analytics usw.) zerstört. Ein Downgrade auf 1.9 löst das Problem.

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


Danke, das hat funktioniert. Ein Upgrade von pyopenssl war für mich nicht ausreichend.
r11

5

In meinem Fall bestand das Problem darin, dass das Paket in Stammverzeichnissen installiert wurde und ich das Skript ausführte, das pyopensslmit meinen Linux-Benutzerforen angefordert wurde . Und dieser Benutzer kann die in root installierten Bibliotheken nicht verwenden.

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

sudo aptitude purge python-openssl

Daher musste ich das Paket erneut installieren, aber den Benutzer berücksichtigen, der das Skript ausführt, das nach der Bibliothek fragt. Sehen Sie sich an, wo die Bibliothek installiert ist, abhängig vom Linux-Benutzer und dem Argument --uservon pip.

Fall 1

forvas@server:$ pip install pyopenssl

Pakete konnten aufgrund eines EnvironmentError nicht installiert werden:

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

Verwenden Sie die --userOption oder überprüfen Sie die Berechtigungen.

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

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

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

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

Fazit

Mein Problem war, dass die Bibliothek in den Verzeichnissen von Fall 5 installiert wurde .

Lösung

  • Paket deinstallieren.

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


Wie würde das für Python 3 aussehen?
Adrian Keister

Nach diesem Beispiel wäre beispielsweise Fall 3 sudo python3 -m pip install --user pyopensslund die Pakete würden in gespeichert /home/forvas/.local/lib/python3.6/site-packages.
Forvas

4

Ich hatte das gleiche Problem und da 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 hat alles wie erwartet funktioniert.


3

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

dpkg -l | grep openssl zeigte:

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

Ich habe es mit entfernt sudo apt-get remove python-openssl. 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 erforderliche Pip-Installation durchführen, die ich abschließen wollte.


1
Danke @heatfanjohn. Ich war genau in der gleichen Situation wie Sie und es funktioniert so, wie Sie es geschrieben haben!
icasimpan

3

Das hat bei mir funktioniert:

sudo apt remove python-openssl

2

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

Tun

sudo pip install pyOpenSSL==16.2.0

löste es für mich.


2

Nur für den Fall, dass jemand anderes nicht genau die richtigen Beschwörungsformeln findet, um diese Arbeit zu machen, war ab November 2018 das, was für mich funktioniert hat:

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

Viel Glück!


2

Ich hatte dieses Problem unter MacOS mit Python 2 und 3, die über Brew installiert wurden. Es stellt sich heraus, dass mit brew uninstallPython und Python @ 2 keine Bibliotheken entfernt werden, die für diese Python-Versionen installiert wurden. dh in:

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

Da drin stimmte etwas nicht, also funktionierte es für mich, alle installierten Bibliotheken für Brews Python 2 und 3 zu löschen / zu verschieben und erneut zu starten (und ab jetzt nur noch virtuelle Umgebungen zu verwenden):

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

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

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

Das Folgende hat bei mir funktioniert.

# 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

WARNUNG : Versuchen Sie dies nur, wenn ein Upgrade ( sudo pip install pyOpenSSL==16.2.0) oder eine Deinstallation ( pip uninstall pyopenssl) nicht hilft


1

Ich hatte das gleiche Problem unter Ubuntu 16.04, aber mit der folgenden Wendung: Als virtualenv aktiviert wurde ( . venv/bin/activatebevor in meinem Fall Sellerie-Arbeiter mit Pysolr, Anfragen usw. ausgeführt wurden), funktionierte alles perfekt, aber als ich Sellerie über die Befehlszeile mit vollständigen Pfaden ausführte und Python-Pfade - Es gab ein Problem (und dasselbe Problem, das vom Supervisord ausgeführt wurde). Falls wichtig, wurde virtualenv an anderer Stelle auf dem Computer mit derselben Ubuntu-Version gebündelt.

Die Lösung war einfach: Hinzufügen /full/path/to/venv/binzu PATH (wie hier empfohlen) /server/331027/supervisord-how-to-append-to-path ) löste dieses Problem.

Leider habe ich noch nicht genau festgelegt, welche Art von Update dies verursacht hat, aber hoffentlich kann dies jemandem helfen.


1

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, und dem, was jemand manuell mit pip in /usr/local/python2.7/dist-packages installiert hat.

Sobald es in diesen Zustand gelangt ist, kann der Systemstandard pip auch nicht ausgeführt werden. Ich habe das Henne-Ei-Problem umgangen, indem ich manuell eine PYTHONPATH-Umgebungsvariable festgelegt habe, die den / usr / local-Teil des Baums folgendermaßen ausschloss:

    $ 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 zur Verwendung mit der Python-Shell erworben:

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

und dann kopieren Sie alles, was aufgelistet ist, mit Ausnahme des Verzeichnisses one / usr / local. Ihr System hat möglicherweise eine andere Liste im Pfad. Dementsprechend anpassen.

Ich hatte auch einige manuelle apt-get install --reinstall python-openssl python-cryptographyBefehle in meiner Bash-Geschichte verstreut, die möglicherweise notwendig waren oder nicht.


1

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.

Am Ende habe ich 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 habe jedoch bemerkt, dass es beim Ausführen der pip-Befehle auf Python 3.6 verweist.

# 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

Versuche es mit:

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

Ich habe einen ähnlichen Python-Stack-Dump auf der Konsole meiner Ubuntu 16.04-VM gesehen, als ich versucht habe, ssh in die VM zu integrieren.

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

pipberichtet, dass pyopensslnicht installiert wurde.

Ich musste das stattdessen tun:

sudo apt install --reinstall python-openssl

0

Dies ist ein älterer Beitrag, daher antworte ich, um hoffentlich Ende 2019 jemandem zu helfen ... mein Problem hatte mit Python 2 vs 3 zu tun. Ich verwende ausschließlich Python 3; kein altes Python mehr. Auf meinem Betriebssystem (z. B. Ubuntu 16.04) ist Python 2.7 noch installiert. Wenn pipich also standardmäßig global ausgeführt werde (z. B. nicht in einer virtuellen Umgebung), habe ich die Python 2-Version von aufgerufenpip .

Für mich habe ich Folgendes verwendet, um dieses Problem zu beheben.

Deinstallieren docker-compose:

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

Neu installieren docker-composefür meine Version von Python:

sudo pip3 install docker-compose
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.