Come posso distribuire programmi Python?


102

La mia applicazione è simile a questa:

main.py
finestre/
    __init__.py
    mainwindow.py
    ...
modello/
    __init__.py
    orders.py
    ...
risorse /
    image1.png
    logo.jpg
    ...

Il programma viene avviato con main.py. C'è un buon modo per creare un'applicazione "finale"? Sto pensando a qualcosa come py2exe / py2app, ma senza copiare l'interprete / i moduli python nell'applicazione in cui si ha un solo eseguibile.

Ho dato un'occhiata a distutils, ma sembra che installi un programma nella directory Python, che non è usuale su piattaforme non Linux.

Al momento copio semplicemente l'intera cartella sorgente sulla macchina di destinazione e creo un alias main.pywsu Windows. Alcuni inconvenienti:

  • L'icona è l'icona predefinita di Python.
  • Devo creare l'alias manualmente.
  • Nella mia directory dei sorgenti ci sono molti file aggiuntivi come la cartella di controllo del codice sorgente.
  • Devo cambiare titolo main.pya main.pywmanualmente.
  • Sarebbe bello se sulla macchina di destinazione fossero presenti solo file `.pyo *. Non c'è una vera ragione per questo, semplicemente non mi piace avere file non necessari.

Come si crea una bella distribuzione automatizzata?

  • per windows? (Questa è l'unica piattaforma che devo supportare al momento.)
  • per mac?
  • per linux?

2
"Ho dato un'occhiata a distutils, ma sembra che installi un programma nella directory Python, che non è usuale su piattaforme non Linux." Perché lo dici? Che testo hai letto che diceva questo? Non è certamente vero, dove hai avuto questa impressione?
S.Lott

Possibile duplicato dei programmi
SebasSBM

Risposte:


37

Il modo normale di distribuire le applicazioni Python è con distutils . È fatto sia per la distribuzione di moduli Python di tipo libreria, sia per applicazioni Python, anche se non so come funziona su Windows. Su Windows dovresti installare Python separatamente se usi distutils, in ogni caso.

Probabilmente consiglierei di distribuirlo con disutils per Linux e Py2exe o qualcosa di simile per Windows. Per OS X non lo so. Se si tratta di un'applicazione per l'utente finale, probabilmente vorresti un tipo di immagine del disco, non so come farlo. Ma leggi questo post per ulteriori informazioni sull'esperienza dell'utente. Per un'applicazione fatta per i programmatori probabilmente stai bene con un'installazione di tipo distutils anche su OS X.


1
Mac e Linux non sono così importanti al momento. Py2app crea pacchetti .app. E penso che la spedizione di app per Mac in .dmg sia obsoleta, si dovrebbe usare .zip. È possibile usare distutils solo per creare una directory diste copiare tutti i file rilevanti in quella?
Georg Schölly

1
@gs: il comando sdist creerà un file tar di tutti i file sorgente.
Martin v. Löwis

5
@gs: la spedizione di app per Mac in .dmg è in realtà estremamente comune. .dmg sono immagini disco e non un formato per applicazioni (che sarebbe .app). Quindi, spesso trovi un singolo .app all'interno di un .dmg, insieme a qualche file README.
Eric O Lebigot

2
@gs Non so perché vuoi che distutils crei solo una directory dist e copi i file lì, puoi farlo tu stesso. Distutils fa molte cose, inclusa la creazione di programmi di installazione di Windows, e da Python 2.6 crea anche collegamenti nel menu Start. Tuttavia, ti richiederà di installare Python separatamente, quindi per un'app per l'utente finale, penso che py2exe sia una soluzione migliore, perché include il proprio Python. La spedizione / installazione per OS X è discussa in dettaglio da Alexander Limi nel suo bloggpost, quindi rimando a lui.
Lennart Regebro


61

Consiglio vivamente Pyinstaller , che supporta tutte le principali piattaforme abbastanza perfettamente. Come py2exe e py2app, produce un eseguibile standard su Windows e un app bundle su OS X, ma ha anche il vantaggio di svolgere un fantastico lavoro di risoluzione automatica delle dipendenze comuni e di includerle senza ulteriori modifiche alla configurazione.

Nota anche che se stai distribuendo Python 2.6 su Windows, dovresti applicare questa patch al trunk di Pyinstaller.

Hai indicato che non hai bisogno di un programma di installazione, ma Inno Setup è una scelta facile da usare e veloce da configurare per la piattaforma Windows.


3
Non sono sicuro che sia eccessivo. Il raggruppamento di un'app con Pyinstaller può in realtà essere più semplice di altri metodi, specialmente quelli con dipendenze da estensioni c ... semplice come una chiamata da riga di comando nella maggior parte dei casi. L'installazione di Python + dipendenze + l'app stessa (sia tramite distutils, ecc. O solo un file zip) è più complicata, soprattutto se lo sviluppatore non è in grado di configurare manualmente la macchina di destinazione da solo e deve fornire istruzioni al client. Almeno su Windows, penso che lo stile di distribuzione abbia senso.
Daniel Naab

1
Un po 'scomodo con pyinstaller, quando si utilizza l'eseguibile creato con pyinstaller, l'inizio dell'esecuzione richiede alcuni secondi.
JuanPablo

1
Esattamente quello che stavo cercando. A volte ho bisogno di far funzionare i miei script su computer dove non posso installare nulla. Un singolo eseguibile senza dipendenze esterne è ciò di cui ho bisogno. Posso risparmiare qualche secondo per l'avvio. Grazie!
CodeMonkey

Non consigliato per piccole applicazioni, poiché un semplice Hello worldprogramma richiederebbe 500 MB di spazio e 3-5 secondi di tempo di inizializzazione.
Raf

È possibile evitare questa quantità di spazio utilizzando un ambiente separato per distribuire l'applicazione (utilizzando venv o pyenv, ad esempio)
Alexander Santos

4

Fredrik Lundh squeeze.pypuò creare un singolo file che non contiene l'interprete Python, ma contiene invece bytecode. Con gli argomenti giusti, puoi includere altri file, moduli, ecc. Nel file dei risultati. L'ho usato con successo in un progetto. Il programma risultante è stato eseguito su OS X, Linux e Windows senza alcun problema!

PS : ogni macchina deve avere un interprete Python compatibile con il bytecode generato da squeeze.py. Puoi generare diverse versioni di bytecode per diverse versioni di Python, se necessario (esegui semplicemente squeeze.py con la versione corretta di Python).


4

Penso che valga la pena menzionare anche PEX (considerando più l'attenzione ricevuta da questa domanda e meno la domanda stessa). Secondo la sua stessa descrizione :

I file PEX sono ambienti virtuali Python eseguibili autonomi. Più specificamente, sono file zip costruiti con cura con un #!/usr/bin/env pythone speciale __main__.pyche consente di interagire con il runtime PEX. Per ulteriori informazioni sulle applicazioni zip, vedere PEP 441 .

Mi sono imbattuto in questo quando ho letto una panoramica della pacchettizzazione per Python . Hanno pubblicato questa bella foto lì: inserisci qui la descrizione dell'immagine

Per riassumere: se puoi permetterti di affidarti all'installazione di python sulla macchina di destinazione, usa PEX per produrre un "eseguibile" auto-contenente che probabilmente avrà dimensioni di file più piccole di un eseguibile prodotto da PyInstaller, per esempio.



1

Se stai distribuendo su Windows, usa un programma di installazione per installare tutti i file rilevanti / interprete qualsiasi cosa sia necessaria. Distribuisci un setup.exe. Questo è il modo migliore su Windows. Altrimenti gli utenti si lamenteranno.


1
Non ho bisogno di un programma di installazione perché c'è un solo utente che utilizzerà il programma. Ma ovviamente quando si scrive un programma per più utenti che è un must su Windows.
Georg Schölly

1
@gs: Oh, solo un utente. Bene, allora consiglierei di creare un pacchetto distutils di base, una distribuzione dei sorgenti o un programma di installazione binario di Windows. Questo è sicuramente un modo semplice e piacevole per distribuire un modulo Python.
Lennart Regebro

0

Il modo più conveniente * multipiattaforma per distribuire applicazioni desktop Python è affidarsi al gestore di pacchetti conda multipiattaforma. Esistono diversi strumenti che lo utilizzano:

  • Miniconda-Install : script powershell / bash che scaricano automaticamente Miniconda e creano un ambiente conda isolato per l'app. Supporta pip ma sembra non essere mantenuto e presenta problemi di download https.
  • Anaconda Project e (conda) costruttore di Continuum. Entrambi usano conda. (conda) sembra essere in grado di creare programmi di installazione autonomi e persino programmi di installazione NSIS su Windows ma non supporta pip. Sembrano comportarsi come gli installatori Anaconda / Miniconda.
  • PyAppShare : l'utente finale installa prima Miniconda / Anaconda (come un ambiente di runtime). Quindi lo script batch / bash di installazione singola crea un ambiente conda isolato dalle specifiche yaml. L'applicazione è anche un pacchetto conda / pip che viene installato nell'ambiente e viene creato un punto di ingresso eseguibile. Collegamenti desktop e programmi multipiattaforma creati automaticamente. Attivano l'ambiente e avviano l'applicazione. Supporta pip.

* Il più conveniente per lo sviluppatore. Abbastanza conveniente per l'utente finale.

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.