2016-03-10 18 views
16

Sto realizzando un programma pygame progettato per essere modulare. Sto costruendo un exe con pygame2exe del file main.py, che in pratica importa solo il vero gioco principale e lo esegue. Quello che spero è una sorta di launcher che eseguirà script Python da un EXE, piuttosto che un singolo programma contenente tutti i file immutabili.Python - crea un EXE che esegue il codice come scritto, non come era quando compilato

Qual è il modo migliore per farlo? Ho provato a utilizzare imp per importare dinamicamente tutti i moduli in fase di runtime invece di importarli implicitamente, ma questo sembra spezzare l'ereditarietà degli oggetti.

+0

come si fa a fare exe? se usi py2exe, c'è una sintassi per questo. – YOU

+0

Sì, sto usando py2exe, qual è la sintassi per questo? –

+0

sai che IDLE fa questo, l'eseguibile per inattività importa solo stuf da 'idlelib' nella libreria standard ed esegue quello, immagino che avresti analogamente bisogno di un solo exe che inoltra al programma attuale –

risposta

1

L'estate scorsa ho avuto problemi con lo stesso problema: creare un singolo file .exe dallo script Python. Comunque non c'era PyGame, ma c'era un PyQt5, che aggiungeva alcuni problemi allo stesso modo. Nessuno degli strumenti standard puri mi ha aiutato.

Finalmente avevo risolto il problema con una chaine: make + Py2exe + 7Zip + Resource Hacker. Questo set mi ha dato un singolo .exe con tutte le risorse a bordo, che non richiedono l'installazione - così puoi metterlo ovunque su Windows Box ed eseguirlo.

Ecco articolo dettagliato: exe built with cx_Freeze, PyQt5, Python3 can't import ExtensionLoader_PyQt5_QtWidgets.py and run

favore, non esitate a fare domande.

+0

Questo EXE eseguirà eventuali modifiche ai file di script senza la necessità di ricompilare? Non sto cercando di ottenere un singolo EXE che incapsuli tutti i file Python, anzi, al contrario. Il programma è pensato per essere modulare, in cui gli utenti possono modificare i valori all'interno degli script ed eseguire il programma con un nuovo comportamento anche senza la necessità di ricompilare o installare alcuna libreria. –

+0

No, il programma è in fase di costruzione in un singolo file. Ma se si modificano i valori, è possibile spostarli in una sorta di file di configurazione o opzioni della riga di comando? –

+0

Il programma deve essere molto più configurabile di poche opzioni. Ho bisogno che il codice sia eseguito dinamicamente. Funziona per la maggior parte delle cose, ma se provo a importare dinamicamente tutto, si interrompe l'ereditarietà multi-file. Se potessi avere un launcher che esegue main.py e non compila nessuno dei file .py, eseguendoli come file .py invece di .pyo, funzionerebbe perfettamente. –

8

Dopo alcuni esperimenti ho trovato una soluzione.

  1. Creare una cartella separata source nella cartella principale dell'applicazione. Qui verranno posizionati i file di origine. Inserisci anche il file __init__.py nella cartella. Consente di denominare un file principale come main_module.py.

  2. Aggiungere tutti i suoi contenuti come file di dati alla configurazione py2exe setup.py. Ora dopo aver compilato il programma, questi file verranno posizionati nella cartella dist.

    data_files += [('source', glob('source/*.py'),)] 
    setup(
         data_files=data_files, 
         .... # other options 
        windows=[ 
          { 
          "script": "launcher.py", 
          "icon_resources": [(0, "resources/favicon.ico")] 
          } 
        ) 
    
  3. Fai launcher.py - è compito è quello di importare tutti di sistema e librerie richieste come pygame, PyQt e così via. Quindi eseguire si programma:

    import sys, time, os, hashlib, atexit # std modules 
    import PyQt5, ... # foreign libraries 
    sys.path.insert(0, 'source') 
    exec('import main_module') 
    
  4. Ora saranno importati main_module.py, se importa i moduli, che verranno importati anche al loro posto in gerarchia. Per esempio capo della main_module.py può essere simile a questo:

    import user_tweaks 
    from user_data import parser 
    

    Questi file user_tweaks.py e user_data.py deve essere situato nella cartella source a percorsi appropriati relativi alla main_module.py.

È possibile modificare il contenuto della cartella source senza il programma di ricompilazione stesso. Ogni programma orario viene utilizzato con contenuti freschi di source.

Come risultato si ha una cartella dell'applicazione con:

  • Un lanciatore separata - semplice.file exe
  • Tutti i moduli richiesti
  • L'applicazione con tutti i suoi moduli.
+0

Potrei potenzialmente caricare _every_ file in questo modo? –

+0

Sì, ho aggiornato la ricetta per caricare tutti i file dalla cartella. –

+1

No, non sembra proprio quello che sto cercando. Ho bisogno di un programma che esegua fondamentalmente "python main.py" senza bisogno di Python e di tutte le librerie installate. Non posso importare da quello e dovrei aggiungere i file a setup.py. Cosa succede se l'utente aggiunge file, ma modifica il codice per importarlo? Questo non è solo un elenco di codice che deve essere eseguito una volta richiesto, è moduli che devono essere importati, fanno parte di una gerarchia di oggetti e sono utilizzati più volte, in file che potrebbero non esistere nemmeno quando l'exe è compilato. –

Problemi correlati