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.
3 Réponses :
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,
choisiengineio
utilise le moduleimportlib
pour importer dynamiquement le module correspondant auasync_mode
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.
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.
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 >
Pour eventlet, installez-le d'abord en utilisant:
pip install eventlet
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?