5

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

ValueError: Invalid async_mode specified

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

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

4

3 回答 3

5

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

from engineio.async_drivers import gevent

希望这也适用于 cx_freez。

于 2019-04-11T22:27:47.180 回答
2

编辑:

尝试将engineio, socketio, flask_socketio, threading, time,添加queue到设置脚本中传递给调用的选项packages列表中:build_exe setup

...

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.threadingimports和threading,但可能不会看到,因为是动态导入的。timequeuecx_Freezeengineio.async_drivers.threading

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

您可能仍需要将更多包添加到packages列表中,例如eventlet, gevent, uwsgi, six, urllib3, ...

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

于 2019-01-14T06:58:49.247 回答
1

对于 eventlet,首先使用以下命令安装它:

pip install eventlet

于 2020-08-22T09:53:12.807 回答