Come rendere eseguibile uno script Python autonomo da eseguire senza QUALSIASI dipendenza?


706

Sto creando un'applicazione Python e non voglio forzare i miei clienti a installare Python e i moduli.

Quindi, c'è un modo per compilare uno script Python in modo che sia un eseguibile autonomo?


307
La parte della domanda che dice "Non voglio forzare i miei clienti a installare Python e moduli". Non dice che i clienti non possono farlo, dice che lo sviluppatore non vuole richiedergli di farlo. Non ha senso discutere qui il punto, perché i clienti non stanno leggendo SO per parlare da soli. Non vorrei installare un ambiente di sviluppo Flash solo per guardare YouTube, o un ambiente di sviluppo C solo per giocare a Sudoku, o un ambiente di sviluppo Python per eseguire una versione di Angry Birds scritta in Python. Ecco a cosa servono i tempi di esecuzione ridistribuibili.
Dave,

Risposte:


243

Puoi usare py2exe come già risposto e usare cython per convertire i tuoi .pyfile chiave in .pyc, file compilati in C, come .dllin Windows e .soin Linux, molto più difficili da ripristinare rispetto ai comuni .pyoe ai .pycfile (e anche ottenere prestazioni!)


1
Grazie per la risposta. Ho considerato Cython, ma sembra che abbia ancora bisogno di Python per eseguire eseguibili compilati. Intendi compilare lo script in .pyc usando Cython? (Non sapevo se Cython avesse una tale caratteristica)
Jeff

9
Voglio dire, hai due problemi : closed source e no-deps. Per la compilazione di sorgenti chiuse compila il tuo codice importante in librerie C usando Cython. Per no-deps usa py2exe e crea un eseguibile con file .pyd (compilati da cython) all'interno.
neurino,

7
Cosa faresti delle biblioteche (numpy, scipy, matplotlib)? Ad esempio, in che modo i client sarebbero in grado di utilizzare la funzione ginput () in matplotlib dall'eseguibile, senza averlo installato sul proprio computer.
chimpsarehungry,

@chimpsarehungry che dire del collegamento statico?
Braden Best,

11
L'ultima versione sembra essere nel 2008, è ancora mantenuta?
Zitrax,

302

È possibile utilizzare PyInstaller per impacchettare i programmi Python come eseguibili autonomi. Funziona su Windows, Linux e Mac.

PyInstaller Quickstart

Installa PyInstaller da PyPI:

pip install pyinstaller

Vai alla directory del tuo programma ed esegui:

pyinstaller yourprogram.py

Questo genererà il bundle in una sottodirectory chiamata dist.

Per una procedura dettagliata, consultare il manuale .


10
Vale la pena notare che pyinstaller può essere compilato in un singolo file .exe. Anche su quale sistema operativo viene eseguito, fa che eseguibile, cioè exe quando eseguito su Windows
Richard de Wit

2
@ ItayMoav-Malimovka Stanno lavorando nel supporto di Python 3. Vedi github.com/pyinstaller/pyinstaller/tree/python3 .
PhoneixS,

3
Come diceva @GeenHenk, se "compili" su Windows crea un exe, tieni presente che non puoi compilare per Windows (crea un exe) su Linux o creare un eseguibile Linux su Windows. Puoi solo rendere il file eseguibile della piattaforma in esecuzione. (In Linux puoi usare wine per ingannare questo)
PhoneixS

14
l'uso di "pyinstaller" è molto più semplice di "py2exe". Si prende cura di tutte le dipendenze tra cui intorpidimento, panda, qualsiasi cosa e ti dà un singolo eseguibile sulla piattaforma di lavoro!
aprile

12
Sembra esattamente quello che stavo cercando. E ora supporta Python 3! Grazie :)
Daniel Gruszczyk il

83

Potresti voler indagare su Nuitka . Prende il codice sorgente di Python e lo converte in chiamate API C ++. Quindi si compila in un file binario eseguibile (ELF su Linux). È in circolazione da alcuni anni e supporta una vasta gamma di versioni di Python.

Probabilmente otterrai anche un miglioramento delle prestazioni se lo usi. Consigliato.


5
Nuitka è uno strumento fantastico. Non c'è bisogno di non usarlo. Vorrei solo sottolineare una cosa - non si limita solo a Linux - è multipiattaforma - un altro motivo per usarlo.
sjaustirni,

5
Nuitka funziona su Python 2.6, 2.7, 3.2, 3.3 e 3.4, ed è multipiattaforma: (Linux, FreeBSD, NetBSD, MacOS X e Windows (32/64 bit). Anche altri possono funzionare. Architetture: x86, x86_64 (amd64) e arm. Altre architetture possono funzionare anche fuori dagli schemi.)
Jonathan Hartley

Non è supportato per il più recente 3.6 .. ed è un incubo da installare su Windows
Tetora,

Funziona come un fascino su macOS High Sierra + Python 3.5.2. Grazie!
Anthony L.,

Questo crea un eseguibile autonomo?
esprime il

31

Vorrei compilare alcune informazioni utili sulla creazione di file autonomi su Windows utilizzando Python 2.7.

Ho usato py2exe e funziona, ma ho avuto alcuni problemi.

Quest'ultima ragione mi ha fatto provare PyInstaller http://www.pyinstaller.org/ .

Secondo me, è molto meglio perché:

  • È più facile da usare.

Suggerisco di creare un file .bat con le seguenti righe (pyinstaller.exe deve trovarsi nel percorso di Windows):

pyinstaller.exe --onefile MyCode.py

Quindi, penso che, almeno per Python 2.7, un'opzione migliore e più semplice sia PyInstaller.


3
Il --onefileflag non ti aiuterà a renderlo portatile su Windows, perché l'eseguibile vuole ancora collegarsi con la api-ms-win-crt-runtime-l1-1-0.dlllibreria (o / e altri) che deve essere installata attraverso il vcredistpacchetto. Quindi una dipendenza è ancora lì e deve essere installata prima dell'esecuzione.
Andry,

27

Sì, è possibile compilare gli script Python in eseguibile autonomo.

PyInstaller può essere utilizzato per convertire i programmi Python in file eseguibili autonomi, in Windows , Linux , Mac OS X , FreeBSD , Solaris e AIX . È uno dei convertitori consigliati.

py2exe converte gli script Python in eseguibili solo nella piattaforma Windows.

Cython è un compilatore statico sia per il linguaggio di programmazione Python che per il linguaggio di programmazione Cython esteso.


2
Grazie per questo. Stavo usando py2exe e non riuscivo a far funzionare le icone. PyInstaller ha funzionato per la prima volta e ha un bell'aspetto!
Chud37,

Posso creare un file eseguibile autonomo da Windows per Linux e macOS? O dovrei installare Linux e macOS su VirtualBox? Non ho abbastanza spazio libero sul mio laptop.
8Observer8

1
Ho trovato la risposta alla mia domanda nella documentazione qui: pyinstaller.readthedocs.io/en/stable/…
8Observer8

26

E una terza opzione è cx_Freeze, che è multipiattaforma.


1
Eccoci a febbraio del 2019 e non ci sono cx_Freezeversioni quotate su pypi dalla fine del 2017. Questo progetto è stato abbandonato?
user9074332,


14

Usa py2exe .... usa sotto i file di configurazione:

 from distutils.core import setup
 import py2exe

 from distutils.filelist import findall
 import matplotlib

 setup(
       console=['PlotMemInfo.py'],

       options={
                'py2exe': {
                'packages' : ['matplotlib'],
            'dll_excludes': ['libgdk-win32-2.0-0.dll',
                                 'libgobject-2.0-0.dll',
                 'libgdk_pixbuf-2.0-0.dll']
                          }
                },
       data_files = matplotlib.get_py2exe_datafiles()
     )

L'ho fatto e ha creato un file python27.dll ed è ancora necessario. Ho spostato il file .exe dalla cartella contenente il file python27.dll e il file .exe non viene più eseguito.
mjwrazor,

Potresti mostrare questo script per Linux e macOS? Voglio creare file eseguibili autonomi da Windows per Linux e macOS.
8Observer8

13

Mi piace pyinstaller - in particolare la variante "a finestre":

pyinstaller --onefile --windowed myscript.py

Creerà un singolo file * .exe in una cartella dist /.


11

Consiglio anche pyinstaller per una migliore compatibilità con le versioni precedenti come python 2.3 - 2.7.
per py2exe , devi avere python 2.6


pyinstaller ha problemi di importazione. Ad esempio: nel mio caso, mi trovo in questo DIR ~ / Documents / python101 / e ex50_pycomp.py & ex50.py si trovano in questa directory. ex50_pycomp.py importando ex50.py. Corro pyinstaller ex50_pycomp.py e vedo tutto rispettato, prodotto dist. Va bene vero? Ho cd in dist / ex50_pycomp / ed eseguo ex50_pycomp funziona. Una volta che ho inserito questo ex50_pycom in una macchina virtuale, allora questo dice errore di importazione e in un'altra finestra di Linux dice "-bash: ./ex_50_pycom: impossibile eseguire il file binario: errore di formato Exec"
driven_spider

prob1: stavo usando python2.7 ma pyinstaller stava parlando con python3 python3 setup.py build python3 setup.py install il tuo python3 otterrà tutto pkg_resources prob 3: se l'utilizzo di sys_path diventa un problema, dai il tuo percorso come questo pyinstaller --hidden- import = pkg_resources --onefile file.py --path = my_path rw-rw-r-- my_path: cartella dist di python3 pyinstaller --hidden-import = pkg_resources --onefile file.py --path = / usr / local / lib /python3.5/dist-packages/my_code_lib-0+untagged.8.gd264bd5.dirty-py3.5.egg/my_folder -rw-rw-r--
driven_spider

8

Per gli script Python 3.2 l'unica scelta è Cxfreeze. Costruiscilo da fonti altrimenti non funzionerà.

Per python 2.x suggerisco pyinstaller in quanto può impacchettare un programma python in un singolo eseguibile, a differenza di CxFreeze che genera anche librerie.



6

Puoi trovare l'elenco delle utility di distribuzione elencate @ https://wiki.python.org/moin/DistributionUtilities .

Uso bbfreeze e ha funzionato molto bene (ancora per avere il supporto di Python 3).



Si occupa delle dipendenze e installa i moduli py pertinenti?
Volatil3,

@ Volatil3 Sì, tutte le dipendenze vengono gestite. WRT per l'installazione di moduli sul sistema host - ci sono diversi tipi di compilation. Bbfreeze compilerà tutto in più .sofile o copierà i file .egg direttamente e saranno tutti presenti in una singola directory (o come un singolo file). Non è richiesta l'installazione.
Joe,

6
pyinstaller yourfile.py -F --onefile

Questo crea un file EXE autonomo in Windows NOTA IMPORTANTE: il file exe verrà generato in una cartella denominata 'dist'

puoi installare pyinstaller usando pip install PyInstaller

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


4

Non esattamente un pacchetto del codice Python, ma ora c'è anche scontroso da Google, che traspone il codice su Go. Non supporta l'API C di Python, quindi potrebbe non funzionare per tutti i progetti.


4

Usando pyinstaller, ho trovato un metodo migliore usando il collegamento a .exe anziché crearlo --onefile. Comunque ci sono probabilmente dei file di dati in giro e se stai eseguendo un'app basata sul sito, il tuo programma dipende anche da file html, js, css. Inutile spostare tutti questi file da qualche parte .. invece cosa succede se spostiamo il percorso di lavoro verso l'alto.

Crea una scorciatoia per l'exe, spostala in alto e imposta la destinazione e i percorsi di avvio come specificato, per avere percorsi relativi che vanno a dist \ folder: Target: %windir%\system32\cmd.exe /c start dist\web_wrapper\web_wrapper.exe Start in: "%windir%\system32\cmd.exe /c start dist\web_wrapper\" posso rinominare la scorciatoia in qualsiasi cosa, così rinominando in "GTFS-Manager"
Ora quando raddoppio -fai clic sul collegamento, è come se avessi eseguito Python sul file! Ho trovato questo approccio migliore di --onefilequello come:

  1. Nel caso di un file, c'è un problema con un .dll mancante per il sistema operativo win7 che necessita di qualche installazione precedente ecc. Sbadiglio. Con la solita build con più file, nessun problema del genere.
  2. Tutti i file che utilizza il mio script Python (sta distribuendo un server web tornado e ha bisogno di un intero sito Web strano di file per essere lì!) Non devono essere spostati da nessuna parte: ho semplicemente creato il collegamento in alto.
  3. Posso effettivamente usare la stessa identica cartella in Ubuntu (eseguire python3 myfile.py) e Windows (fare doppio clic sul collegamento).
  4. Non ho bisogno di preoccuparmi dell'hacking eccessivamente complicato del file .spec per includere file di dati ecc.

Oh, ricorda di eliminare la cartella di build dopo la creazione, salverà sulla dimensione.


Ciao, sto solo aggiornando .. Ho deciso di rinunciare alla compressione UPX e finalmente il modo --onefile. Ho dovuto sceglierne uno, perché UPX attualmente ha un bug nel comprimere una particolare DLL.
Nikhil VJ,

3

Usa Cython per convertire in c, compilare e collegarti con gcc. Un altro potrebbe essere, rendere le funzioni principali in c (quelle che si vogliono rendere difficili da invertire), compilarle e usare python boost per importare il codice compilato (in più si ottiene un'esecuzione del codice molto più veloce). quindi utilizzare qualsiasi strumento menzionato per distribuire.


1

Mi è stato detto che PyRun, https://www.egenix.com/products/python/PyRun/ , è anche un'opzione.


5
Un link a una soluzione è il benvenuto, ma assicurati che la tua risposta sia utile senza di essa: aggiungi un contesto attorno al link in modo che i tuoi colleghi utenti abbiano qualche idea di cosa sia e perché sia ​​lì, quindi cita la parte più pertinente della pagina che ' re collegamento a nel caso in cui la pagina di destinazione non sia disponibile. Le risposte che sono poco più di un collegamento possono essere eliminate.
Petter Friberg,

Questa opzione non supporta attualmente Windows.
bob
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.