4
votes

"ValueError: async_mode spécifié non valide" lors du regroupement d'une application Flask avec cx_Freeze

Je crée une API qui utilise Waitress, Flask et Flask_SocketIO dans Windows. Tout fonctionne bien à partir de la ligne de commande, mais lorsque j'essaie de regrouper mon API dans un .exe en utilisant cx_Freeze puis de l'exécuter, j'obtiens l'erreur:

ValueError: Invalid async_mode specified

La seule chose que j'ai été un thread github python-socketio peut trouver ce problème. Il y a une tonne de bonnes suggestions dans ce fil à essayer pour résoudre ce problème, mais j'ai tout essayé mais j'ai toujours le même résultat.

Je soupçonne que j'ai un module manquant, mais je n'ai aucune idée de comment savoir précisément quel module manque. Quelqu'un a-t-il des suggestions de choses à essayer? Même si cela ne résout pas directement mon problème, savoir comment explorer la trace de la pile pour trouver le module manquant serait utile.


5 commentaires

Quels modules avez-vous inclus?


sys, datetime, flask, flask_socketio, jwt, ConfigParser, pyodbc et uuid


Ce n'est pas le problème, vous devez importer des sous-modules spécifiques du package python-engineio pour que les choses fonctionnent. Les personnes qui ont commenté le fil de discussion que vous avez lié ont expliqué ce qu'elles faisaient pour que les choses fonctionnent.


Je suis juste revenu sur ce fil et j'ai essayé quelques modes async_modes différents et j'ai inclus leurs modules respectifs dans le paquet cx_freeze, mais j'ai continué à obtenir la même erreur.


L'emplacement des modules asynchrones a changé, avez-vous adapté les noms d'importation aux emplacements actuels?


3 Réponses :


2
votes

EDIT:

Essayez d'ajouter engineio , socketio , flask_socketio , threading , heure , file d'attente à la liste packages du build_exe options transmises à l'appel setup dans votre script de configuration:

...

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}})

Tel que publié par espretto dans le fil de discussion que vous avez lié:

Apparemment, engineio utilise le module importlib pour importer dynamiquement le module correspondant au async_mode

choisi

cx_Freeze n'interprète pas ce code et ne sait donc pas que des sous-modules de engineio doivent être inclus, vous devez le dire.

engineio.async_drivers.threading importe threading , time et queue , mais cx_Freeze ne verra probablement pas cela car engineio.async_drivers.threading est importé dynamiquement.

Si queue ne fonctionne pas, remplacez par Queue.

Vous devrez peut-être ajouter d'autres packages à la liste des packages , tels que eventlet , gevent , uwsgi , six , urllib3 , ...

Veuillez poster la trace complète de la pile de le message d'erreur que vous obtenez. Voir où se produit l'erreur et examiner le code source de engineio peut aider à trouver le paquet manquant.


3 commentaires

J'ai essayé de définir explicitement async_mode sur 'threading' et d'importer async_threading et j'ai eu la même erreur


@brian avez-vous essayé d'ajouter engineio et peut-être socketio et flask_socketio à la liste des packages dans votre script de configuration? Avez-vous toujours la même erreur? Au moins engineio effectue une importation dynamique qui n'est probablement pas reconnue par cx_Freeze , importer uniquement async_threading peut ne pas suffire.


@brian J'ai modifié ma réponse avec d'autres suggestions.



1
votes

Cela m'a beaucoup dérangé lors de l'utilisation de pyInstaller. J'ai essayé d'ajouter de nombreux modules différents à hiddleImports, mais j'ai réalisé plus tard qu'il vous suffit de mentionner ci-dessous dans votre fichier py.

from engineio.async_drivers import gevent

J'espère que cela fonctionne également pour cx_freez.

p >


0 commentaires

0
votes

Pour eventlet, installez-le d'abord en utilisant:

pip install eventlet


0 commentaires