[PYTHON] Pip konnte aufgrund von ssl nicht aktualisiert werden

Problem

Überblick

Ich habe versucht, pip zu aktualisieren, und als ich den Befehl ausführte, konnte ich nicht aktualisieren, da ssl nicht funktionierte.

Lösung

Es stellte sich heraus, dass ich aufgrund des Upgrades die openssl-Bibliothek, in der ich Python installiert hatte, nicht finden konnte. Diesmal blieb die alte Version von openssl erhalten, sodass ich sie lösen konnte, indem ich install_name_tool verwendete, um mir den Speicherort der gemeinsam genutzten Bibliothek mitzuteilen oder den symbolischen Link erneut einzufügen.

Umgebung

Es ist ein Problem aufgetreten

Ich habe versucht, pip zu aktualisieren, und als ich den Befehl ausführte, wurde die Fehlermeldung angezeigt, dass ssl nicht funktioniert und nicht aktualisiert werden konnte.

hoge-Macbook:~ hoge$ pip install -U pip
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/pip/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/pip/
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/pip/
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/pip/
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/pip/
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)) - skipping
Requirement already up-to-date: pip in ./.pyenv/versions/3.6.3/lib/python3.6/site-packages (19.3.1)
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)) - skipping

Als ich versuchte, ssl aus der Python-Shell zu importieren, wurde die Fehlermeldung angezeigt, dass die Bibliothek nicht gefunden wurde.

>>> import ssl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/ssl.py", line 101, in <module>
    import _ssl             # if we can't import it, let the error propagate
ImportError: dlopen(/Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so, 2): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so
  Reason: image not found

Verfolgung der Ursache

Es scheint, dass die dynamische Bibliothek /Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so durcheinander ist, also hängt es von otool ab. Ich habe die Bibliothek überprüft. Als Ergebnis wurde festgestellt, dass openssl Version 1.0.0 der Bibliothek benötigt.

hoge-Macbook:Users hoge$ otool -L /Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so
/Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so:
	/usr/local/opt/openssl/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)

Das Verzeichnis (/ usr / local / opt / openssl / lib), das die Bibliothek 1.0.0 enthalten sollte, enthielt jedoch 1.1.

hoge-Macbook:Users hoge$ ls /usr/local/opt/openssl/lib
engines-1.1		libcrypto.a		libssl.1.1.dylib	libssl.dylib
libcrypto.1.1.dylib	libcrypto.dylib		libssl.a		pkgconfig
ls -l /usr/local/opt/
lrwxr-xr-x  1 hoge  admin  28  4 29 12:41 openssl -> ../Cellar/[email protected]/1.1.1f

Dies bedeutet, dass 1.0.0 fehlt und Sie eine Fehlermeldung erhalten, sodass Sie openssl finden müssen.

Bewältigung

Als ich danach gesucht habe, scheint es, dass openssl (Version 1.0.0) immer noch auf dem Mac verbleibt. Deshalb habe ich beschlossen, Ihnen das Verzeichnis mitzuteilen, in dem sich 1.0.0 befindet.

Problemumgehung 1. Verwenden Sie install_name_tool, um den Speicherort der Bibliothek neu zu schreiben

Ich habe den Speicherort der beiden abhängigen Bibliotheken libssl.1.0.0.dylib und libcrypto.1.0.0.dylib neu geschrieben, die beim Ausführen von otool an den richtigen Speicherort mit install_name_tool angezeigt wurden.

install_name_tool -change /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/Cellar/openssl/1.0.2s/lib/libssl.1.0.0.dylib /Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so
install_name_tool -change /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/Cellar/openssl/1.0.2s/lib/libcrypto.1.0.0.dylib /Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so
hoge-Macbook:procon hoge$ otool -L /Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so
/Users/hoge/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload/_ssl.cpython-36m-darwin.so:
	/usr/local/Cellar/openssl/1.0.2s/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/local/Cellar/openssl/1.0.2s/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)

Problemumgehung 2. Schreiben Sie den symbolischen Link neu

Auch wenn Sie install_name_tool nicht verwenden, können Sie das Problem beheben, indem Sie die symbolische Verknüpfung wiederherstellen und auf 1.0.0 zeigen.

ln -nfs /usr/local/Cellar/openssl/1.0.2s/ /usr/local/opt/openssl

Ergebnis

Sie können ssl importieren, indem Sie entweder 1 oder 2 Workaround und pip verwenden Ich konnte aktualisieren.

Recommended Posts

Pip konnte aufgrund von ssl nicht aktualisiert werden
Wenn ich versuche, pip zu verwenden, ist das SSL-Modul nicht verfügbar.
[Hinweis] QXcbConnection: Es konnte keine Verbindung zur Anzeige hergestellt werden
Wenn pip aufgrund von SSL stoppt, ist es besser, Python selbst neu zu installieren
Was tun, wenn Sie URL 443 mit pip nicht abrufen konnten?
Ein Befehl zum automatischen Aktualisieren der Pip-Bibliothek in einem Stapel
So installieren Sie pip
So aktualisieren Sie easy_install
So aktualisieren Sie Spyder
Aktualisieren Sie die Django-Version 1.11.1 auf 2.2
So überprüfen Sie, wann Sie keine Verbindung zum Server von python-memcached herstellen können
[virtualbox] Was tun, wenn [Spiegelliste nicht abgerufen werden konnte] angezeigt wird, wenn ein yum-Update unter CentOS7 durchgeführt wird?
Mir wurde gesagt, dass ich XML_SetHashSalt nicht finden konnte, als ich versuchte, pip mit Python zu verwenden.