2013-03-01 10 views
9

Buduję aplikację w pythonie 3.3, która korzysta z biblioteki żądań. Kiedy próbuję uzyskać adres URL z połączeniem SSL, chcę go zweryfikować za pomocą opcji verify = true. Działa to doskonale podczas uruchamiania moich skryptów Pythona.Biblioteka żądań: brakujący plik po cx_freeze

Po zatrzymaniu tych samych skryptów ulega awarii. Tęskni za czymś i naprawdę nie mogę wymyślić, jak zintegrować go w mojej zamrożonej aplikacji.

pojawia się następujący błąd (który wyzwala również inne błędy, ale nie umieszczać je tutaj):

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 

Wydaje się, że ca_certs brakuje. W bibliotece żądań znajduje się plik o nazwie cacert.pem, ale nie wiem, czy jest to brakujący plik i jak go zaimportować, ponieważ wydaje się, że nie jest on zintegrowany z moim zamrożonym pakietem.

+0

Moduły wymagające oddzielnych plików (takich jak plik klucza) mają problemy z zamrożeniem. Może zajść potrzeba edycji kodu żądania. –

+0

Oczywiście istnieje możliwość, że będzie działać, ale byłoby ładniej, gdyby plik został zaimportowany do paczki z folderu modułu. Czy możliwe jest również wymuszenie importu tego konkretnego pliku podczas procesu zamrażania? W procesie instalacji dostępne są funkcje importowania, ale nie wiem, jak z nich korzystać, ponieważ oficjalna dokumentacja nie jest do końca jasna. – Ecno92

Odpowiedz

9

Patrząc na źródło żądań, wydaje się, że można przekazać ścieżkę do pliku cacert.pem jako verify=path, zamiast verify=True. Nie trzeba modyfikować żądań, aby działał.

Możesz przekazać ścieżkę pliku, aby dołączyć parametropcji cx_Freeze (docs). Można znaleźć drogę od wniosków, więc coś jak to powinno działać w setup.py użyć, aby go zamrażać:

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

#... 
+5

Dziękuję bardzo. To było rozwiązanie po niewielkiej zmianie. Opisana metoda nie jest możliwa, ponieważ CX_Freeze nie zaakceptuje bezwzględnej ścieżki takiej jak ta. Kluczem jest użycie krotki, w której najpierw podajesz absolutną ścieżkę w pierwszej połowie i drugiej połowie ścieżki docelowej. W ten sposób zadziałało, ustawiając opcję weryfikacji na True. W ten sposób: "include_files": [(requests.certs.where(), "cacert.pem")] – Ecno92

+0

Dzięki.Zaktualizowałem odpowiedź, aby było jasne dla każdego, kto się z tym spotka. –

4

Jak Thomas K powiedział, trzeba to a certyfikaty CA plik, jeśli umożliwiają weryfikację.

Jednak znalazłem, że przynajmniej dla mnie, requests będzie szukać [INSTALL PATH]\library.zip\cacert.pem, które się nie powiedzie.

Rozwiązałem go kopiując cacert.pem opisanym

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

#... 

i określono jego ścieżkę bezpośrednio podczas wykonywania żądania:

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

Tak, a "ŚCIEŻKA INSTALACYJNA" może być określona przez [cx_freeze] [sugerowana metoda znajdowania plików danych] (https://cx-freeze.readthedocs.org/en/latest/faq.html#using-data-files) – toefftoefftoeff