2013-03-01 4 views
9

Sto costruendo un'applicazione in python 3.3 che utilizza la libreria delle richieste. Quando provo a ottenere un URL con connessione SSL, voglio verificarlo con verify = true. Questo funziona perfettamente quando si eseguono i miei script Python.Richieste: file mancante dopo cx_freeze

Quando blocco gli stessi script si blocca. Manca qualcosa e non riesco davvero a capire come integrarlo nella mia applicazione congelata.

ottengo il seguente errore (che innesca anche altri errori, ma io non li inserisco qui):

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 

Sembra che ca_certs manca. C'è un file chiamato cacert.pem nella libreria delle richieste, ma non so se questo è il file mancante e come importarlo poiché sembra non essere integrato nel mio pacchetto finale congelato.

+0

I moduli che richiedono file separati (come il file chiave qui) tendono ad avere problemi quando vengono congelati. Potrebbe essere necessario modificare il codice richieste. –

+0

Offcourse che è una possibilità che funzionerà, ma sarebbe più bello se il file fosse importato nel pacchetto dalla cartella del modulo. È anche possibile forzare questo specifico file da importare durante il processo di freeze? Ci sono funzioni di importazione disponibili nel processo di installazione, ma non so come usarle esattamente poiché la documentazione ufficiale non è molto chiara a riguardo. – Ecno92

risposta

9

Osservando la fonte delle richieste, sembra possibile passare il percorso al file cacert.pem come verify=path, anziché verify=True. Quindi non è necessario modificare le richieste per farlo funzionare.

È possibile passare il percorso di un file da includere nel parametro include-files delle opzioni cx_Freeze (docs). È possibile trovare il percorso dalle richieste, in modo da qualcosa di simile dovrebbe lavorare nel setup.py utilizzato per congelare:

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

#... 
+5

Grazie mille. Questa era la soluzione dopo un piccolo cambiamento. Il metodo che descrivi non è possibile poiché CX_Freeze non accetta un percorso assoluto come questo. La chiave è usare una tupla dove prima si assegna il percorso assoluto nel primo tempo e nella seconda metà il percorso di destinazione. In questo modo ha funzionato impostando la verifica su True. Così come questo: "include_files": [(requests.certs.where(), 'cacert.pem')] – Ecno92

+0

Grazie.Ho aggiornato la risposta, quindi è chiaro per chiunque altro si imbatta in questo. –

4

Come Thomas K detto, è necessario includere un file certificati CA se si attiva la verifica.

Tuttavia, ho trovato che almeno per me, requests cercherà [INSTALL PATH]\library.zip\cacert.pem che non riuscirà.

ho risolto copiando il cacert.pem come descritto

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

#... 

ed indicato il suo percorso direttamente durante l'esecuzione di una richiesta:

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

Sì, e il 'INSTALL PATH' può essere determinato dal [metodo suggerito per trovare i file di dati] di cx_freeze (https://cx-freeze.readthedocs.org/en/latest/faq.html#using-data-files) – toefftoefftoeff