web-dev-qa-db-fra.com

Comment créer correctement un crochet pyinstaller, ou peut-être une importation cachée?

J'ai deux paquets (disons, dataread et datainspector) qui n'ont pas été détectés par PyInstaller. Pour cette raison, l'application se termine lorsque l'application en cours d'exécution atteint le point où elle doit importer des modules à partir de ces packages.

La solution la plus simple serait de copier dataread et datainspector dans une application packagée. Mais cela va briser l'intention d'empaqueter une version binaire de l'application.

J'ai lu des informations sur les importations masquées et le crochet, et je pense que les deux peuvent résoudre le problème, mais je ne sais pas lequel utiliser.

Aucune suggestion? PS: ces deux packages peuvent contenir des répertoires imbriqués.

16
swdev

Les crochets sont des fichiers qui spécifient des actions supplémentaires lorsque pyinstaller trouve une instruction d'importation. Donc, si vous ajoutez un fichier "hook-data.py" avec hiddenimports = ['_proxy', 'utils', 'defs'] à l'intérieur si pyinstaller trouvera import data il recherchera des commandes supplémentaires dans hook-data.py fichier. Vous devez spécifier le chemin d'accès aux hooks par --additional-hooks-dir (il est préférable de garder un espace de travail propre que de mélanger les fichiers de compilation uniquement avec la source)

http://pythonhosted.org/PyInstaller/hooks.html

La solution la plus simple consiste à utiliser --hidden-import=modulename avec le script pyinstaller. Il ajoutera le module comme instruction d'importation en silence.

Les crochets sont meilleurs si vous souhaitez spécifier quel fichier a besoin de quel module. "--hidden-import" est plus simple en une seule fois ou pour le débogage.

27
Dawid Gosławski