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.