J'ai créé une belle application Twisted en python avec un plugin pour le runner twistd, comme spécifié dans la documentation Twisted : http://twistedmatrix.com/documents/current/core/howto/tap.html . J'ai des problèmes pour l'empaqueter avec PyInstaller : mon plugin twistd n'est pas trouvé lors de l'exécution de l'application gelée.
Pour expédier mon projet, j'ai créé mon propre script de démarrage de haut niveau script en utilisant les modules d'exécution twistd, par exemple
#!/usr/bin/env python
from twisted.scripts.twistd import run
from sys import argv
argv[1:] = [
'--pidfile', '/var/run/myapp.pid',
'--logfile', '/var/run/myapp.log',
'myapp_plugin'
]
run()
Ensuite, j'utilise PyInstaller pour figer le déploiement dans un seul répertoire. L'exécution du script gelé ci-dessus échoue car il ne trouve pas mon plugin twistd (édité par souci de concision) :
~/pyinstall/dist/bin/mystartup?16632/twisted/python/modules.py:758:
UserWarning: ~/pyinstall/dist/mystartup?16632 (for module twisted.plugins)
not in path importer cache (PEP 302 violation - check your local configuration).
~/pyinstall/dist/bin/mystartup: Unknown command: myapp_plugin
Normalement, Twistd inspecte le chemin du système Python pour découvrir mon plugin dans twisted/plugins/myapp_plugin.py. Si j'imprime la liste des plugins twistd dans mon script de démarrage, la liste est vide dans l'exécutable résultant de PyInstaller, par ex.
from twisted.plugin import IPlugin, getPlugins
plugins = list(getPlugins(IPlugin))
print "Twistd plugins=%s" % plugins
J'utilise un fichier de spécification PyInstaller un peu par défaut, sans importations cachées ou crochets d'importation spécifiés.
J'aime la fonctionnalité de twistd avec la journalisation, les fichiers pid, etc, donc j'aimerais éviter d'avoir à abandonner complètement le runner twistd pour contourner le problème du plugin. Existe-t-il un moyen de s'assurer que mon plugin twistd se trouve dans l'exécutable gelé ?