2013-03-01 9 views
9

Ich bin eine Anwendung in Python 3.3 erstellen, die die Bibliothek Anforderungen verwendet. Wenn ich versuche, eine URL mit SSL-Verbindung zu erhalten, möchte ich sie mit verify = true verifizieren. Dies funktioniert perfekt beim Ausführen meiner Python-Skripte.Anforderungen Bibliothek: fehlende Datei nach cx_freeze

Wenn ich die gleichen Skripte einfriere, stürzt es ab. Es vermisst etwas und ich kann wirklich nicht herausfinden, wie ich es in meine eingefrorene Anwendung integrieren kann.

bekomme ich folgende Fehler (die auch andere Fehler auslöst, aber ich weiß nicht, sie hier posten):

Traceback (most recent call last): 
File "C:\Python33-32\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 422, in urlopen 
body=body, headers=headers) 
File "C:\Python33-32\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 274, in _make_request 
conn.request(method, url, **httplib_request_kw) 
File "C:\Python33-32\lib\http\client.py", line 1049, in request 
self._send_request(method, url, body, headers) 
File "C:\Python33-32\lib\http\client.py", line 1087, in _send_request 
self.endheaders(body) 
File "C:\Python33-32\lib\http\client.py", line 1045, in endheaders 
self._send_output(message_body) 
File "C:\Python33-32\lib\http\client.py", line 890, in _send_output 
self.send(msg) 
File "C:\Python33-32\lib\http\client.py", line 828, in send 
self.connect() 
File "C:\Python33-32\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 105, in connect 
ssl_version=self.ssl_version) 
File "C:\Python33-32\lib\site-packages\requests\packages\urllib3\util.py", line 281, in ssl_wrap_socket 
context.load_verify_locations(ca_certs) 
FileNotFoundError: [Errno 2] No such file or directory 

Es scheint, dass ca_certs fehlt. Es gibt eine Datei namens cacert.pem in der Requests-Bibliothek, aber ich weiß nicht, ob dies die fehlende Datei ist und wie sie importiert wird, da sie anscheinend nicht in mein endgültiges eingefrorenes Paket integriert ist.

+0

Module, die separate Dateien benötigen (wie hier die Schlüsseldatei), haben beim Einfrieren Probleme. Möglicherweise müssen Sie den Anforderungscode bearbeiten. –

+0

Natürlich ist das eine Möglichkeit, die wahrscheinlich funktioniert, aber es wäre schöner, wenn die Datei aus dem Modulordner in das Paket importiert wird. Ist es auch möglich, diese bestimmte Datei während des Einfrierens zu importieren? Es gibt Import-Funktionen im Setup-Prozess, aber ich weiß nicht, wie man sie genau verwendet, da die offizielle Dokumentation nicht sehr klar ist. – Ecno92

Antwort

9

Mit Blick auf die Anfragequelle scheint es, dass Sie den Pfad zur Datei cacert.pem als verify=path statt verify=True übergeben können. Sie müssen also keine Anforderungen ändern, damit sie funktionieren.

Sie können den Pfad einer Datei übergeben, die im Parameter include-files der cx_Freeze-Optionen (docs) enthalten sein soll. Sie können den Pfad von Anfragen finden, so etwas wie dies sollte in der setup.py Sie es zum Einfrieren verwenden arbeiten:

import requests.certs 
build_exe_options = {"include_files":[(requests.certs.where(),'cacert.pem')]} 

#... 
+5

Vielen Dank. Dies war die Lösung nach einer kleinen Änderung. Die von Ihnen beschriebene Methode ist nicht möglich, da CX_Freeze keinen absoluten Pfad wie diesen akzeptiert. Der Schlüssel besteht darin, ein Tupel zu verwenden, bei dem Sie zuerst den absoluten Pfad in der ersten Hälfte und in der zweiten Hälfte den Zielpfad angeben. Auf diese Weise funktionierte es, indem die Überprüfung auf "True" gesetzt wurde. Also wie folgt: "include_files": [(requests.certs.where(), 'cacert.pem')] – Ecno92

+0

Danke.Ich habe die Antwort aktualisiert, so dass es für jeden anderen klar ist, der darauf stößt. –

4

Wie Thomas K sagte, müssen Sie ein CA-Zertifikate-Datei enthalten, wenn Sie die Überprüfung ermöglichen.

Allerdings habe ich festgestellt, dass zumindest für mich requests nach [INSTALL PATH]\library.zip\cacert.pem suchen wird, die fehlschlagen wird.

ich es durch Kopieren des cacert.pem wie beschrieben gelöst

import requests.certs 
build_exe_options = {"include_files":[(requests.certs.where(),'cacert.pem')]} 

#... 

und spezifiziert direkt den Weg, wenn eine Anfrage ausführt:

requests.get(..., verify = '[INSTALL PATH]\cacert.pem') 
+0

Ja, und der 'INSTALL PATH' kann durch cx_freeze's [vorgeschlagene Methode zum Suchen von Dateien] bestimmt werden (https://cx-freeze.readthedocs.org/en/latest/faq.html#using-data-files) – toefftoefftoeff