我正在构建一个在Windows中使用Waitress,Flask和Flask_SocketIO的API。一切都可以从命令行正常运行,但是当我尝试使用cx_Freeze将我的API捆绑到.exe中然后运行它时,出现错误消息:
ValueError: Invalid async_mode specified
关于这个问题,我唯一能找到的就是python-socketio github thread。为了解决此问题,该线程中有很多不错的建议可以尝试,但是我已经尝试了每件事,但仍然有相同的结果。
我怀疑我缺少模块,但是我不知道如何具体找出哪个模块丢失。有人对尝试的事情有任何建议吗?即使它不能直接解决我的问题,了解如何深入堆栈跟踪以查找丢失的模块也会很有帮助。
答案 0 :(得分:2)
编辑:
尝试将engineio
,socketio
,flask_socketio
,threading
,time
,queue
添加到以下对象的packages
列表中在设置脚本中传递给build_exe
调用的setup
options:
...
packages = [] # Add here the list of packages you have already included
packages += ['engineio', 'socketio', 'flask_socketio', 'threading', 'time', 'queue']
...
setup(...,
options={'build_exe': {...,
'packages'=packages}})
espretto在您链接的线程中发布:
显然,
engineio
使用importlib
模块来动态导入与所选async_mode
相对应的模块
cx_Freeze
不会解释此代码,因此不知道engineio
的子模块是否需要包含,您需要告诉它。
engineio.async_drivers.threading
会导入threading
,time
和queue
,但是cx_Freeze
可能不会看到,因为engineio.async_drivers.threading
是动态导入的。 / p>
如果queue
不起作用,请替换为Queue
。
您可能仍需要向packages
列表中添加其他软件包,例如eventlet
,gevent
,uwsgi
,six
,{{1} },...
请发布您收到的错误消息的完整堆栈跟踪。查看错误发生的位置并查看urllib3
的源代码可能有助于查找丢失的软件包。
答案 1 :(得分:0)
这在使用pyInstaller时让我非常困扰。我尝试向hiddleImports添加许多不同的模块,但后来意识到您只需要在py文件中提及以下内容即可。
from engineio.async_drivers import gevent
希望这对cx_freez也适用。
答案 2 :(得分:0)
对于eventlet,请先使用以下命令进行安装:
pip install eventlet