Modo affidabile per garantire che altre persone possano eseguire il mio programma Python


17

Vorrei mettere un programma Python su GitHub e fare in modo che altre persone lo scarichino e lo eseguano sui loro computer con sistemi operativi assortiti. Sono relativamente nuovo su Python ma l'ho usato abbastanza per aver notato che far lavorare insieme le versioni assortite di tutti i moduli inclusi può essere problematico. Ho appena scoperto l'uso di requirements.txt(generato con pipreqse distribuito con il comando pip install -r /path/to/requirements.txt), ma sono stato molto sorpreso di notare che in requirements.txtrealtà non indica quale versione di Python viene utilizzata, quindi ovviamente non è la soluzione completa da sola. Quindi la mia domanda è: quale set di specifiche / file / qualcos'altro è necessario per garantire che qualcuno che scarica il mio progetto sarà effettivamente in grado di eseguirlo con il minor numero possibile di problemi.

EDIT: Il mio piano era di essere guidato da qualsiasi risposta ottenesse il maggior numero di voti. Ma finora, dopo 4 risposte e 127 visualizzazioni, nessuna risposta ha nemmeno un voto. Se alcune delle risposte non vanno bene, sarebbe utile vedere alcuni commenti sul perché non vanno bene.


1
per il minor numero possibile di problemi, hai preso in considerazione Docker (o altre soluzioni basate su container)? docker.com
Zaccharie Ramzi

Ri: Docker ... Ho appena trovato questo: "lo sviluppatore può essere certo che l'applicazione funzionerà su qualsiasi altra macchina Linux" - ma voglio che funzioni su qualsiasi sistema operativo. ( opensource.com/resources/what-docker )
Mick

Normalmente hai il supporto per tutti i sistemi operativi classici: windows ( docs.docker.com/docker-for-windows ) e mac ( docs.docker.com/docker-for-windows )
Zaccharie Ramzi

2
La risposta qui è altamente contestuale. Il programma Python sta facendo cose che sono syso oso funzioni di tipo sottoprocesso o più matematiche / analitiche? Il primo può cambiare con ogni versione di Python e successivamente può essere abbastanza indipendente dalla versione. Quali librerie dipendenti? numpy e panda svolgono un lavoro straordinario su tutte le piattaforme, quindi puoi semplicemente verificare di avere una versione minima. Quale versione principale di Python? La differenza tra Python 2.xe 3.x con le librerie dipendenti diventa ancora più dura. Se scrivi un buon codice indirizzato a una versione principale comune, è un ottimo inizio.
dawg

2
Come evidenziato dalla miriade di risposte, ci sono molti modi per farlo. Sono davvero curioso di sapere se le risposte sarebbero cambiare in base sapendo ciò che l'applicazione è. Vorrei credere che non dovrebbe importare, ma sospetto che potrebbe. Penso anche che dipenda molto dal pubblico previsto. Esperto di dottorato in fisica che esegue un'applicazione di machine learning contro Joe Internet giocando a un gioco di dama.
Marcel Wilson,

Risposte:


15

Hai preso in considerazione la creazione di un setup.pyfile? È un modo pratico di raggruppare tutto il tuo ... ben impostato in un'unica posizione. Quindi tutto ciò che l'utente deve fare è A) clonare il repository e B) eseguire pip install .per eseguire ilsetup.py

C'è una grande discussione in pila su questo.

Così come un esempio di handle scritto dal ragazzo delle richieste.

Questo dovrebbe coprire la maggior parte dei casi d'uso. Ora, se vuoi renderlo veramente distribuibile, ti consigliamo di configurarlo in PyPi , l'hub di distribuzione ufficiale.

Inoltre, se stai chiedendo come rendere un programma "indipendente dal sistema operativo", non esiste una dimensione adatta a tutti. Dipende da cosa stai facendo con il tuo codice. Richiede una ricerca su come il tuo particolare codice interagisce con quei sistemi operativi ecc.


7

Ci sono molti, molti, molti, molti, molti, molti, molti modi per farlo. Passerò in rassegna i principi alla base di ciascuno di essi ed è un caso d'uso.

1. Un ambiente Python

Ci sono molti modi per farlo. pipenv, conda requirments.txt, ecc. ecc.

Con alcuni di questi, è possibile specificare le versioni di Python. Con altri, basta specificare una gamma di versioni di Python con cui sai che funziona - ad esempio, se stai usando Python 3.7, è improbabile che non supporti 3.6; ci sono solo una o due modifiche minori. 3.8 dovrebbe funzionare anche.

Un altro metodo simile è setup.py. Questi sono generalmente usati per distribuire librerie - come PyInstaller (un'altra soluzione che menzionerò di seguito), o numpy, o wxPython, o PyQt5 ecc. - per l'uso della riga di comando / importazione. La guida al packaging di Python è piuttosto utile e ci sono un sacco di tutorial là fuori. (google python setup.py tutorial) Puoi anche specificare i requisiti in questi file.

2. Un contenitore

Docker è quello grande. Se non ne hai sentito parlare, sarò sorpreso. Un rapido google di un riepilogo viene fornito con questo , che citerò parte di:

Allora perché tutti amano i container e Docker? James Bottomley, ex CTO della virtualizzazione dei server di Parallels e uno dei principali sviluppatori del kernel Linux, ha spiegato che gli hypervisor VM, come Hyper-V, KVM e Xen, sono tutti "basati sull'emulazione dell'hardware virtuale. Ciò significa che sono grassi in termini di requisiti di sistema."

I contenitori, tuttavia, utilizzano sistemi operativi condivisi. Ciò significa che sono molto più efficienti degli hypervisor in termini di risorse di sistema. Invece di virtualizzare l'hardware, i contenitori poggiano su un'unica istanza Linux. Ciò significa che puoi "lasciarti alle spalle l'inutile robaccia VM del 99,9 percento, lasciandoti con una capsula piccola e pulita contenente la tua applicazione"

Questo dovrebbe riassumerlo per te. (Nota che non è necessario un sistema operativo specifico per i contenitori.)

3. Un file eseguibile

Ci sono 2 strumenti principali che lo fanno al momento della scrittura. PyInstaller e cx_Freeze. Entrambi sono attivamente sviluppati. Entrambi sono open source.

Prendi lo script e lo strumento lo compila in bytecode, trova le importazioni, le copia e crea un ambiente Python portatile che esegue lo script sul sistema di destinazione senza che l'utente finale abbia bisogno di Python.

Personalmente, preferisco PyInstaller: sono uno degli sviluppatori. PyInstaller fornisce tutte le sue funzionalità tramite uno script da riga di comando e supporta la maggior parte delle librerie a cui puoi pensare - ed è estendibile per supportare di più. cx_Freeze richiede uno script di installazione.

Entrambi gli strumenti supportano Windows, Linux, macOS e altro. PyInstaller può creare ex file singoli o un pacchetto di una cartella, mentre cx_Freeze supporta solo un pacchetto di cartelle. PyInstaller 3.6 supporta Python 2.7 e 3.5-3.7, ma 4.0 non supporterà Python 2. cx_Freeze ha abbandonato il supporto di Python 2 dall'ultima versione principale (6.0 credo).

Comunque, abbastanza sulle funzionalità degli strumenti; puoi esaminare quelli da soli. (Vedi https://pyinstaller.org e https://cx-freeze.readthedocs.io per maggiori informazioni)

Quando si utilizza questo metodo di distribuzione, di solito si fornisce il codice sorgente sul repository GitHub, un paio di ex (uno per ogni piattaforma) pronti per il download e istruzioni su come compilare il codice in un file eseguibile.


1

Lo strumento migliore che ho usato finora per questo è Pipenv . Non solo unifica e semplifica l'intero flusso di lavoro pip + virtualenv per te, sviluppatore, ma garantisce anche che le versioni esatte di tutte le dipendenze (incluso lo stesso Python) siano soddisfatte quando altre persone eseguono il tuo progetto con esso.

Il sito web del progetto fa un ottimo lavoro nel spiegare come usare lo strumento, ma, per completezza, darò una breve spiegazione qui.

Dopo aver installato Pipenv (ad esempio, eseguendo pip install --user pipenv), puoi andare alla directory del tuo progetto ed eseguire pipenv --python 3.7, quindi Pipenv creerà un nuovo virtualenv per il tuo progetto, creerà un Pipfile e un Pipfile.lock (ne parleremo più avanti) . Se vai avanti ed esegui pipenv install -r requirements.txt, installerai tutti i tuoi pacchetti. Ora puoi fare un pipenv shellper attivare il tuo nuovo virtualenv o pipenv run your_main_file.pysemplicemente per eseguire il tuo progetto.

Ora diamo un'occhiata al contenuto del tuo Pipfile. Dovrebbe essere qualcosa di simile a questo:

[packages]
Django = "*"
djangorestframework = "*"
iso8601 = "*"
graypy = "*"
whitenoise = "*"

[requires]
python_version = "3.7"

Questo file ha le specifiche leggibili dall'uomo per le dipendenze del tuo progetto (nota che specifica anche la versione di Python). Se il tuo requisito.txt aveva versioni bloccate, anche il tuo Pipfile poteva averle, ma puoi assegnarle in modo sicuro, poiché le versioni esatte sono memorizzate in Pipfile.lock. Ora puoi eseguire cose come pipenv updateaggiornare le tue dipendenze e non dimenticare di affidare Pipfile e Pipfile.lock al tuo VCS.

Una volta che le persone clonano il tuo progetto, tutto ciò che devono fare è eseguire pipenv installe Pipenv si occuperà del resto (potrebbe persino installare la versione corretta di Python per loro).

Spero sia stato utile. Non sono affiliato in alcun modo a Pipenv, volevo solo condividere questo fantastico strumento.


1

Se il tuo programma riguarda meno la GUI o ha una GUI Web, puoi condividere il codice utilizzando Google Colaboratory.

https://colab.research.google.com/

Tutti possono eseguirlo con lo stesso ambiente. Non è necessaria l'installazione.


1

Nel caso in cui la conversione di tutti i tuoi script Python in un eseguibile ti possa aiutare, la mia risposta di seguito sarebbe di aiuto ...

Ho sviluppato una grande applicazione desktop puramente in Python da 3 anni. Si tratta di uno strumento basato sulla GUI basato sulla libreria pyqt (collegamenti python del framework QT C ++).

Attualmente sto usando la libreria di pacchettizzazione " py2exe ": è un'estensione distutils che permette di creare programmi eseguibili autonomi (32-bit e 64-bit) da script Python; tutto quello che devi fare è:

  1. install py2exe: 'pip install py2exe'

  2. Crea uno script setup.py: viene utilizzato per specificare il contenuto del file EXE finale (nome, icona, autore, file di dati, librerie condivise, ecc.)

  3. Eseguire: python setup.py py2exe

Sto anche usando il software "Inno Setup" per creare il programma di installazione: creazione di collegamenti, impostazione di variabili di ambiente, icone, ecc ...


py2exe non è stato aggiornato da anni. Non riesco a trovare alcuna attività recente. Presumo quindi, non è mantenuto. (Inoltre, supporta solo Python <3.4. Ciò significa che supporta solo versioni di Python obsolete).
Legorooj,


-1

Poiché manca dalle altre risposte, vorrei aggiungere un aspetto completamente diverso:

Test unitari. O test in generale.

Di solito, è bene avere una buona configurazione nota. A seconda delle dipendenze del programma, potrebbe essere necessario testare diverse combinazioni di pacchetti. Puoi farlo in modo automatizzato, ad esempio toxo come parte di una pipeline CI / CD.

Non esiste una regola generale su quale combinazione di pacchetti debba essere testata, ma di solito la compatibilità con python2 / 3 è un grosso problema. Se si hanno forti dipendenze da pacchetti con differenze sostanziali di versione, è possibile prendere in considerazione la possibilità di provare con queste diverse versioni.


Questo è un aspetto molto importante dello sviluppo del software. Tuttavia, questo non riesce completamente a rispondere alla domanda . In che modo i test unitari aiutano la distribuzione di un programma?
Legorooj,

IMHO, OP non sta specificamente chiedendo informazioni sulla distribuzione. Chiede dei modi per assicurarsi che altre persone possano eseguire il suo programma. Penso che i test unitari possano effettivamente aiutare a farlo, poiché le persone potrebbero essere limitate nel set di pacchetti che possono essere utilizzati. In generale, la domanda sulla distribuzione è importante (ed è stata data una risposta qui), ma penso che in uno scenario del mondo reale, non possiamo fare affidamento sulla creazione di un intero venv solo per un singolo pacchetto - deve essere compatibile con almeno alcune configurazioni standard.
Dschoni

Non sto contestando che il test delle unità è prezioso nel fare in modo che corre in modo corretto, ma l'OP ha chiesto come condividere il codice in un "facile da installare" moda. Ecco perché penso che questa sia una risposta non valida - per questa domanda specifica.
Legorooj,

Penso ancora che la domanda non riguardi solo la distribuzione. Ecco perché ho aggiunto questa risposta. Se si sviluppa, ad esempio, su Windows, il test su Unix è essenziale se si desidera assicurarsi che venga eseguito prima della distribuzione.
Dschoni,

Per curiosità, in cosa differisce da quello che ho appena detto? ... making sure it runs correctly ...? I test sono una parte essenziale di fare in modo che viene eseguito correttamente, quindi è una parte essenziale della preparazione per distribuirlo, ma non è ancora nulla a che fare con la realtà distribuzione esso
Legorooj

-1

Ti fornirò un breve riassunto di alcune delle soluzioni disponibili esistenti quando si tratta di packaging in pitone tra cui puoi scegliere (conoscenza è potere):

  1. Segui le linee guida fornite in Structuring Your Project , queste convenzioni sono ampiamente accettate dalla community di Python ed è di solito un buon punto di partenza quando i nuovi arrivati ​​iniziano a scrivere codice in Python. Seguendo queste linee guida i pitoni che guardano il tuo progetto / sorgente su github o altri luoghi simili sapranno subito come installarlo. Inoltre, caricare il tuo progetto su pypi e aggiungere l'IC seguendo queste regole sarà indolore.

  2. Una volta che il progetto è strutturato correttamente secondo le convenzioni standard, il passaggio successivo potrebbe essere l'utilizzo di alcuni dei congelatori disponibili , nel caso in cui si desideri spedire agli utenti finali un pacchetto che possono installare senza costringere loro a installare Python sul loro macchinari. Tieni presente che questi strumenti non ti forniranno alcuna protezione del codice ... detto altrimenti, l'estrazione del codice Python originale dagli artefatti finali sarebbe banale in tutti i casi

  3. Se desideri comunque spedire il tuo progetto ai tuoi utenti senza forzarli a installare alcuna dipendenza da sviluppo e ti preoccupi anche della protezione del codice, quindi non vuoi prendere in considerazione nessuno dei congelatori esistenti, potresti usare strumenti come nuitka , shedskin , cython o simili. Di solito l'inversione del codice dagli artefatti prodotti da questi strumenti non è affatto banale ... Craccare la protezione d'altra parte è una questione diversa e se non si fornisce un file binario fisico all'utente finale non si può fare molto a parte altro che rallentarli :)

  4. Inoltre, nel caso in cui avessi bisogno di usare lingue esterne nel tuo progetto Python, un altro classico link che mi viene in mente sarebbe https://wiki.python.org/moin/IntegratingPythonWithOtherLanguages , aggiungendo i sistemi di build di tali strumenti a CI seguendo le regole di 1 sarebbero abbastanza facili.

Detto questo, suggerirei di attenersi al punto 1 poiché so che sarà più che sufficiente per iniziare, anche quel particolare punto dovrebbe coprire molti dei casi d'uso esistenti per i progetti "standard" di Python.

Anche se questo non vuole essere una guida completa seguendo quelli che sarai in grado di pubblicare il tuo progetto Python sulle masse in pochissimo tempo.

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.