"ValueError: Указан неверный async_mode" при объединении приложения Flask с использованием cx_Freeze
Я строю API, который использует Waitress, Flask и Flask_SocketIO в Windows. Все работает нормально из командной строки, но когда я пытаюсь связать мой API в.exe с помощью cx_Freeze, а затем запустить его, я получаю ошибку:
ValueError: Invalid async_mode specified
Единственное, что мне удалось найти по этому вопросу, - это поток Python-socketio github. В этой ветке есть куча хороших предложений, чтобы попытаться решить эту проблему, но я пробовал все до единого, но все равно получал тот же результат.
Я подозреваю, что у меня отсутствует модуль, но я не знаю, как конкретно определить, какой модуль отсутствует. У кого-нибудь есть предложения, что попробовать? Даже если это не решит мою проблему напрямую, было бы полезно знать, как детализировать трассировку стека, чтобы найти отсутствующий модуль.
1 ответ
Это очень беспокоило меня при использовании pyInstaller. Я попытался добавить много разных модулей в hiddleImports, но позже понял, что вам просто нужно упомянуть ниже в вашем файле py.
from engineio.async_drivers import gevent
Надеюсь, что это работает и для cx_freez.
РЕДАКТИРОВАТЬ:
Попробуй добавить 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.threading
импорт threading
, time
а также queue
, но cx_Freeze
вероятно, не увидят этого, потому что engineio.async_drivers.threading
импортируется динамически.
Если queue
не работает, заменить на Queue
,
Возможно, вам все еще придется добавить дополнительные пакеты в packages
список, такой как eventlet
, gevent
, uwsgi
, six
, urllib3
...
Пожалуйста, опубликуйте полную трассировку стека полученного сообщения об ошибке. Видеть, где происходит ошибка и смотреть в исходный код engineio
может помочь найти пропавший пакет.
Для eventlet сначала установите его, используя:
pip install eventlet