2013-03-01 128 views
9

我在使用請求庫的python 3.3中構建應用程序。 當我嘗試使用SSL連接來獲取URL時,我想用verify = true來驗證它。 這在運行我的python腳本時可以很好地工作。請求庫:cx_freeze後缺少文件

當我凍結相同的腳本它崩潰。它錯過了一些東西,我真的不知道如何將它整合到我的冷凍應用程序中。

我得到以下錯誤(這也引發其他錯誤,但我不張貼在這裏):

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 

似乎ca_certs丟失。在請求庫中有一個名爲cacert.pem的文件,但我不知道這是否是丟失的文件以及如何導入它,因爲它似乎沒有集成到我的最終凍結包中。

+0

需要單獨文件(如此處的密鑰文件)的模塊在凍結時往往會遇到問題。您可能需要編輯請求代碼。 – 2013-03-01 13:29:09

+0

Offcourse這是一種可能會有效的工作,但如果文件從模塊文件夾導入到包中會更好。在凍結過程中是否可以強制導入此特定文件?在安裝過程中有可用的導入功能,但我不知道如何使用它們,因爲官方文檔對此不太清楚。 – Ecno92 2013-03-03 22:17:48

回答

9

看看請求源,看起來您可以將路徑傳遞到cacert.pem文件,如verify=path,而不是verify=True。所以你不需要修改它的工作請求。

您可以傳遞文件的路徑以包含在cx_Freeze選項的include-files參數中(docs)。你可以找到從請求路徑,所以這樣的事情應該在setup.py你用工作來凍結它:

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

#... 
+5

非常感謝。這是一個小改動後的解決方案。你描述的方法是不可能的,因爲CX_Freeze不會接受這樣的絕對路徑。關鍵是要使用一個元組,首先在前半部分給出絕對路徑,在後半部分給出目標路徑的絕對路徑。通過這種方式,它將驗證設置爲True。 所以像這樣:「include_files」:[(requests.certs.where(),'cacert.pem')] – Ecno92 2013-03-05 18:09:13

+0

謝謝。我已經更新了答案,因此對於遇到此問題的任何人都很清楚。 – 2013-03-06 13:05:20

4

正如Thomas K說,你需要包括如果啓用驗證一個 CA證書文件。

但是,我發現至少對我而言,requests會尋找[INSTALL PATH]\library.zip\cacert.pem,這將會失敗。

我解決它通過複製cacert.pem如上所述

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

#... 

以及執行請求時,直接指定其路徑:

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

是的,可以通過cx_freeze的[建議的查找數據文件的方法](https://cx-freeze.readthedocs.org/en/latest/faq.html#using-data-files)來確定「INSTALL PATH」 – toefftoefftoeff 2016-03-02 13:44:47