Question

J'utilise PyInstaller pour transformer deux scripts en un seul fichier exécutable, dont l'un appelle l'autre.Le problème que je rencontre est que je n'arrive pas à comprendre comment regrouper les deux scripts tout en les laissant se référencer l'un l'autre:

Le code qui cause le problème est qu'un script, script1.py contient:

subprocess.call(['gksudo','python script2.py'])

Cela fonctionne bien lorsque j'exécute les scripts normalement, mais une fois qu'ils sont empaquetés dans PyInstaller, je ne sais pas comment faire fonctionner l'appel.

Était-ce utile?

La solution

Je ne pense pas que pyinstaller puisse gérer ce type de bundling seul, du moins je n'ai pas réussi à le configurer si possible. J'ai aussi une application assez volumineuse où certains appels à

sous-processus.Popen ('python' ...)

sont terminés. La façon dont je l'ai finalement fait fonctionner était:

  1. Modifiez vos appels de sous-processus vers un autre python, comme subprocess.call(['gksudo','./python script2.py']). Créez deux analyses distinctes, une pour le point d'entrée et une pour le reste des scripts, dans votre cas:

    a1 - analyse de script1.py a2 - analyse de script2.py

  2. Créez l'exe uniquement à partir des scripts de point d'entrée:

    pyz = PYZ(a1.pure)
    exe = EXE(pyz,
      a1.scripts,
      exclude_binaries=1,
      name={name here},
      debug=False,
      strip=False,
      upx=True,
      console=1 )
    
  3. Collecte de tous les scripts

        coll = COLLECT( exe,
           a1.binaries,
           a1.zipfiles,
           a1.datas,
           a2.binaries,
           a2.zipfiles,
           a2.datas,
       python_tree, 
           *additional_trees,
           strip=False,
           upx=True,
           name={})
    
  4. Copiez python dans votre distribution à l'emplacement spécifié dans tous les appels de sous-processus avec des exigences supplémentaires qui n'ont pas été trouvées par pyinstaller (j'en avais quelques-unes comme matplotlib, pylab, etc.)

  5. Créez un script de démarrage qui modifie d'abord toutes les variables d'environnement requises pour pointer vers votre package, puis démarrez l'application. Dans mon cas, ce qu'il fallait, c'était à partir du répertoire d'appel:

     export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
     export LD_RUN_PATH=`pwd`:$LD_RUN_PATH
    

Maintenant, tout cela était requis si je voulais que l'application s'exécute sur des machines sur lesquelles aucun python n'était installé ou si python était installé, assurez-vous que l'application utilise toujours toutes les bibliothèques du package de distribution au lieu de toutes les bibliothèques locales . Si dans votre cas, python est déjà installé sur les machines cibles, je ne pense pas que quelque chose de ce genre soit nécessaire et les 3 premières étapes suffiraient.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top