Domanda

Sto usando Pyinstaller per trasformare due script in un file eseguibile, uno dei quali chiama l'altro. Il problema che sto riscontrando è che non riesco a capire come raggruppare i due script e lasciarli fare riferimento l'un l'altro:

Il codice che causa il problema è che uno script, script1.py contiene:

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

Funziona bene quando eseguo gli script normalmente, ma una volta che sono confezionati in Pyinstaller non so come far funzionare la chiamata.

È stato utile?

Soluzione

Non credo che Pyinstaller possa gestire questo tipo di raggruppamento da solo, almeno non sono riuscito a configurarlo se possibile. Ho anche un'applicazione piuttosto grande in cui alcune chiamate

subprocess.popen ('python' ...)

sono fatti. Il modo in cui finalmente l'ho fatto funzionare è stato:

  1. Modifica le tue chiamate di sottoprocesso a un Python diverso, come subprocess.call(['gksudo','./python script2.py']). Crea due analisi separate, una per il punto di ingresso e una per il resto degli script, nel tuo caso:

    A1 - Analisi di script1.py A2 - Analisi di script20

  2. Crea l'EXE solo dagli script del punto di ingresso:

    pyz = PYZ(a1.pure)
    exe = EXE(pyz,
      a1.scripts,
      exclude_binaries=1,
      name={name here},
      debug=False,
      strip=False,
      upx=True,
      console=1 )
    
  3. Raccogli da tutti gli script

        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. Copia Python nella tua distribuzione nella posizione specificata in tutte le chiamate del sottoprocesso con eventuali requisiti aggiuntivi che non sono stati trovati da Pyinstaller (ne avevo alcuni come Matplotlib, Pylab ecc.

  5. Crea uno script di avvio che prima modifica qualsiasi variabile ambientale richiesta per indicare il pacchetto e quindi avviare l'app. Nel mio caso ciò che era necessario era, dalla directory di chiamata:

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

Ora tutti questi erano richiesti se volevo che l'applicazione funzionasse su macchine che non avevano installato Python o se hanno installato Python, assicurarsi che l'app utilizzasse ancora tutte le librerie del pacchetto di distribuzione anziché qualsiasi librerie locali. Se nel tuo caso Python fosse già installato su macchine target, non penso che sarebbe necessario nulla del genere e i primi 3 passaggi sarebbero sufficienti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top