Python 请求库:cx\U冻结后缺少SSL握手证书文件

Python 请求库:cx\U冻结后缺少SSL握手证书文件,python,python-requests,cx-freeze,Python,Python Requests,Cx Freeze,我正在用python 3.3构建一个应用程序,它使用请求库。 当我尝试使用SSL连接获取URL时,我希望使用verify=true进行验证。 这在运行python脚本时非常有效 当我冻结相同的脚本时,它崩溃了。它遗漏了一些东西,我真的不知道如何将它集成到我冻结的应用程序中 我得到以下错误(这也会触发其他错误,但我不会在这里发布): 似乎ca_证书不见了。请求库中有一个名为cacert.pem的文件,但我不知道这是否是丢失的文件以及如何导入它,因为它似乎没有集成到我的最终冻结包中。查看请求源,您似

我正在用python 3.3构建一个应用程序,它使用请求库。 当我尝试使用SSL连接获取URL时,我希望使用verify=true进行验证。 这在运行python脚本时非常有效

当我冻结相同的脚本时,它崩溃了。它遗漏了一些东西,我真的不知道如何将它集成到我冻结的应用程序中

我得到以下错误(这也会触发其他错误,但我不会在这里发布):


似乎ca_证书不见了。请求库中有一个名为cacert.pem的文件,但我不知道这是否是丢失的文件以及如何导入它,因为它似乎没有集成到我的最终冻结包中。

查看请求源,您似乎可以将
cacert.pem
文件的路径作为
verify=path
传递,而不是
verify=True
。因此,您无需修改请求即可使其工作

您可以在cx\U冻结选项()的
include files
参数中传递要包含的文件路径。您可以从请求中找到路径,因此在用于冻结路径的
setup.py
中应该可以使用类似的方法:

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

#...
如上所述,如果启用验证,则需要包含CA证书文件

但是,我发现至少对我来说,
请求
将查找将失败的
[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')

您还可以使用环境变量“REQUESTS\u CA\u BUNDLE”(如上所述)

这比更正所有请求要简单得多:

os.environ["REQUESTS_CA_BUNDLE"] = os.path.join(os.getcwd(), "cacert.pem")

需要单独文件(如此处的密钥文件)的模块在冻结时往往会遇到问题。您可能需要编辑请求代码。当然,这可能会起作用,但如果将文件从模块文件夹导入包中会更好。是否也可以在冻结过程中强制导入此特定文件?在安装过程中有一些导入功能,但我不知道如何使用它们,因为官方文档对此不是很清楚。非常感谢。这是一个小变化后的解决方案。您描述的方法是不可能的,因为CX_Freeze不会接受这样的绝对路径。关键是要使用一个元组,在元组中,首先在前半部分给出绝对路径,在后半部分给出目标路径。通过这种方式,它通过将verify设置为True来工作。就像这样:“包含_文件”:[(requests.certs.where(),'cacert.pem')]谢谢。我已经更新了答案,以便任何其他遇到此问题的人都能清楚地看到。是的,
安装路径可以由cx\U freeze确定
os.environ["REQUESTS_CA_BUNDLE"] = os.path.join(os.getcwd(), "cacert.pem")