"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

Другие вопросы по тегам