«ValueError: Указан неверный async_mode» при объединении приложения Flask с использованием cx_Freeze - PullRequest
0 голосов
/ 11 января 2019

Я создаю API, который использует Waitress, Flask и Flask_SocketIO в Windows. Все отлично работает из командной строки, но когда я пытаюсь связать мой API в .exe с помощью cx_Freeze, а затем запустить его, я получаю сообщение об ошибке:

ValueError: Invalid async_mode specified

Единственное, что мне удалось найти по этой проблеме, это python-socketio github thread . В этой ветке есть куча хороших предложений, чтобы попытаться решить эту проблему, но я пробовал все до единого, но все равно получал тот же результат.

Я подозреваю, что у меня отсутствует модуль, но я не знаю, как конкретно определить, какой модуль отсутствует. У кого-нибудь есть предложения, что попробовать? Даже если это не решит мою проблему напрямую, полезно знать, как детализировать трассировку стека, чтобы найти отсутствующий модуль.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Это очень беспокоило меня при использовании pyInstaller. Я попытался добавить много разных модулей в hiddleImports, но позже понял, что вам просто нужно упомянуть ниже в вашем py-файле.

from engineio.async_drivers import gevent

Надеюсь, это работает и для cx_freez.

0 голосов
/ 14 января 2019

EDIT:

Попробуйте добавить 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 может помочь найти отсутствующий пакет.

...