使用cx_Freeze

时间:2019-01-11 16:54:14

标签: python flask cx-freeze flask-socketio waitress

我正在构建一个在Windows中使用Waitress,Flask和Flask_SocketIO的API。一切都可以从命令行正常运行,但是当我尝试使用cx_Freeze将我的API捆绑到.exe中然后运行它时,出现错误消息:

ValueError: Invalid async_mode specified

关于这个问题,我唯一能找到的就是python-socketio github thread。为了解决此问题,该线程中有很多不错的建议可以尝试,但是我已经尝试了每件事,但仍然有相同的结果。

我怀疑我缺少模块,但是我不知道如何具体找出哪个模块丢失。有人对尝试的事情有任何建议吗?即使它不能直接解决我的问题,了解如何深入堆栈跟踪以查找丢失的模块也会很有帮助。

3 个答案:

答案 0 :(得分:2)

编辑:

尝试将engineiosocketioflask_socketiothreadingtimequeue添加到以下对象的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会导入threadingtimequeue,但是cx_Freeze可能不会看到,因为engineio.async_drivers.threading是动态导入的。 / p>

如果queue不起作用,请替换为Queue

您可能仍需要向packages列表中添加其他软件包,例如eventletgeventuwsgisix,{{1} },...

请发布您收到的错误消息的完整堆栈跟踪。查看错误发生的位置并查看urllib3的源代码可能有助于查找丢失的软件包。

答案 1 :(得分:0)

这在使用pyInstaller时让我非常困扰。我尝试向hiddleImports添加许多不同的模块,但后来意识到您只需要在py文件中提及以下内容即可。

from engineio.async_drivers import gevent

希望这对cx_freez也适用。

答案 2 :(得分:0)

对于eventlet,请先使用以下命令进行安装:

pip install eventlet