使用cx_freeze
从python代码创建可执行文件时遇到了一些问题。生成的可执行文件从Anaconda提示符运行,但是在Windows cmd(或通过单击.exe)中运行时,程序将退出并显示与请求包相关的错误消息。
这是一个最小的工作示例。首先,将冻结的脚本:main.py
import requests
r = requests.get('https://github.com/')
print(r.text)
第二,cx_freeze
的设置脚本:setup.py
import cx_Freeze
build_exe_options = {
"includes": [],'include_files': [],'excludes' : [],'packages' : []
}
base = None
executables = [cx_Freeze.Executable('main.py',base=base)]
cx_Freeze.setup(name = "MWE",options = {"build_exe": build_exe_options},executables = executables)
问题出在这里
- 在python中运行
main.py
可以正常工作 - 通过
python setup.py build
构建可执行文件很好 - 在Anaconda提示符下运行结果
main.exe
可以正常工作 -
在Windows cmd中运行
main.exe
(或通过单击鼠标开始)退出并显示以下错误消息:Traceback (most recent call last): File "P:\Anaconda3\lib\site-packages\cx_Freeze\initscripts\__startup__.py",line 40,in run module.run() File "P:\Anaconda3\lib\site-packages\cx_Freeze\initscripts\Console.py",line 23,in run exec(code,{'__name__': '__main__'}) File "main.py",line 9,in <module> r = requests.get('https://github.com/') File "P:\Anaconda3\lib\site-packages\requests\api.py",line 75,in get return request('get',url,params=params,**kwargs) File "P:\Anaconda3\lib\site-packages\requests\api.py",line 60,in request return session.request(method=method,url=url,**kwargs) File "P:\Anaconda3\lib\site-packages\requests\sessions.py",line 533,in request resp = self.send(prep,**send_kwargs) File "P:\Anaconda3\lib\site-packages\requests\sessions.py",line 646,in send r = adapter.send(request,**kwargs) File "P:\Anaconda3\lib\site-packages\requests\adapters.py",line 514,in send raise SSLError(e,request=request) requests.exceptions.SSLError: HTTPSConnectionPool(host='github.com',port=443): Max retries exceeded with url: / (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available."))
在研究了相关问题之后,似乎出现的问题是某些DLL没有复制到应用程序的构建文件夹中,因此应用程序无法找到这些文件。我尝试过但未取得积极结果的内容:
- 在设置脚本中使用了
includes
和packages
选项,以包含某些软件包(如here所述) - 手动将
libssl
和libcrypto
复制到构建文件夹(如here和here所述) - 通过设置脚本中的
include_files
选项复制相同的文件 - 如here和here所述,将
(requests.certs.where(),'cacert.pem')
添加到include_files
和os.environ["REQUESTS_CA_BUNDLE"] = os.path.join(os.getcwd(),"cacert.pem")
添加到setup.py
有人知道如何避免这个问题吗?有谁知道如何找出确切缺少的文件,以便可以将其复制到应用程序文件夹中?除了requests
之外,其他软件包也遇到了同样的问题。