Come creare pacchetti di app Python con BeeWare Briefcase

Python non è all'altezza in alcune aree. Ad esempio, Python non è il linguaggio più veloce in circolazione, ma le librerie di terze parti come NumPy ti consentono di aggirare questo problema. Dove Python è più carente, però, è il packaging. Cioè, Python non dispone di un meccanismo interno coerente per la generazione di un binario autonomo da un'applicazione. Vai e Rust fallo. Perché non può Python?

Principalmente si tratta di Python che non ha una cultura di tali casi d'uso fino a tempi relativamente recenti nella sua storia. E così, solo relativamente di recente sono stati visualizzati moduli di terze parti che consentono alle app Python di essere pacchettizzate come binari autonomi. PyInstaller, di cui ho parlato in precedenza, è una di queste app. In questo articolo vedremo un'utilità ancora più elegante e potente per la creazione di pacchetti di app Python, la valigetta di BeeWare.

[Anche su: Python virtualenv e venv cosa fare e cosa non fare]

Tuttavia, ci sono due avvertenze che vale la pena sottolineare su Briefcase. Innanzitutto, Briefcase non esegue il packaging multipiattaforma; devi costruire sulla piattaforma per la quale stai distribuendo. In secondo luogo, Briefcase funziona meglio con le app che utilizzano un toolkit GUI di qualche tipo. Entreremo nei dettagli di questi problemi di seguito.

Cos'è la valigetta BeeWare?

Briefcase fa parte di una suite generale di strumenti di BeeWare per la creazione di app, con i diversi pezzi che si completano a vicenda. Ad esempio, Kivy di BeeWare ti consente di creare app GUI multipiattaforma in Python che funzionano non solo su tutte le principali piattaforme OS ma anche sul web. Ma qui ci concentreremo su Briefcase, che può essere utilizzato con o senza gli altri strumenti.

La valigetta racchiude app per tutti i sistemi operativi supportati tramite un formato comune per le app su quella piattaforma:

  • Microsoft Windows (programma di installazione MSI)
  • macOS ( .app file di formato)
  • Linux (AppImage)
  • iOS (progetto Xcode)
  • Android (progetto Gradle)

Per distribuire su iOS o Android, avrai bisogno dei kit di sviluppo per quelle piattaforme.

Una cosa che Briefcase  non  supporta è la distribuzione multipiattaforma. Ad esempio, se sei un utente Windows, non puoi creare un'app macOS; avrai bisogno di macOS per farlo. Altri bundler di app per Python sono similmente limitati, quindi questa restrizione non è in alcun modo esclusiva di Briefcase.

Briefcase non è nemmeno un "compilatore": non trasforma i programmi Python nei loro equivalenti nativi del codice macchina. Le tue app non verranno eseguite più velocemente quando distribuite come app Sincronia file rispetto a quanto fanno normalmente.

Configurazione del progetto valigetta

Briefcase richiede di impostare una directory di progetto dedicata con il proprio ambiente virtuale. Se non hai ancora familiarità con "venvs", come vengono chiamati gli ambienti virtuali Python, vale la pena aggiornarsi su di essi, poiché lo sviluppo all'avanguardia di Python ruota fortemente attorno ad essi.

Dopo aver configurato un venv e  pip install briefcase in esso, utilizzerai gli strumenti della riga di comando di Briefcase per configurare, gestire e distribuire progetti in pacchetto Briefcase. Questo è simile al modo in cui funzionano strumenti come Poetry: la maggior parte delle interazioni di alto livello con il progetto avvengono attraverso lo strumento, quindi non è necessario creare manualmente file o modificare configurazioni.

Per avviare un nuovo progetto Briefcase, apri la CLI nella directory del tuo progetto, attiva l'ambiente virtuale (supponendo che tu non stia utilizzando una CLI dell'IDE per farlo automaticamente) e digita  briefcase new. Questo crea scaffolding nella directory del progetto per un progetto Briefcase.

All'inizio dovrai rispondere ad alcune domande sul progetto e per la maggior parte di esse puoi semplicemente premere  Enter per accettare l'impostazione predefinita. Ma una delle domande che ti verranno poste - l'ultima, appunto - è molto importante: la scelta del framework GUI da utilizzare.

Una delle altre offerte di BeeWare è un toolkit dell'interfaccia utente chiamato Toga, per la creazione di GUI nei programmi Python utilizzando componenti dell'interfaccia utente nativi della piattaforma. Se vuoi iniziare ad imparare Toga mentre lavori anche con Briefcase, non c'è niente che ti fermi. Oppure puoi selezionare "Nessuno" e creare un'app "headless" che viene eseguita dalla riga di comando, oppure puoi utilizzare un toolkit UI di terze parti o un sistema a finestre come Pyglet o PyQT.

Nota che se non installi alcun toolkit dell'interfaccia utente, l'app non avrà alcuna interattività della console, ovvero non aprirà una finestra della console e non stamperà nulla sulla console. Ciò è utile se si distribuisce un programma che non richiede l'interazione con la console, ad esempio se viene eseguito come server Web locale e utilizza un browser Web per l'interazione. Ma non esiste ancora alcuna opzione per consentire ai programmi Briefcase senza pacchetto dell'interfaccia utente installato di funzionare con una console.

Briefcase struttura del progetto

Una directory dell'app Briefcase appena avviata viene fornita con diversi file preinstallati:

  • Il livello superiore della directory dell'app contiene la licenza del progetto, il  pyproject.toml file, un file README di esempio in formato ReStructured Text e un  .gitignore file pre-personalizzato con directory comuni da omettere da qualsiasi repository Git creato per il progetto.
  • La  src directory contiene il codice sorgente della tua app, con due sottodirectory: una che contiene l'app (ha lo stesso nome della directory del tuo progetto) e una che contiene i metadati dell'app.
  • La directory dell'app contiene una  resources directory, che viene utilizzata per archiviare risorse come le icone delle applicazioni.

Briefcase comandi di progetto

Il  briefcase comando è il modo in cui esegui la maggior parte delle tue interazioni con un progetto Briefcase. Abbiamo coperto il  new comando sopra, che viene utilizzato per impostare un progetto Briefcase in una determinata cartella. Ma in genere è necessario utilizzare molti altri comandi durante il ciclo di vita di un'app Briefcase e alcuni di essi possono essere un po 'controintuitivi.

Di seguito sono riportati i comandi Briefcase più comuni che utilizzerai:

  • dev: Quando sei all'interno di una directory dell'app, questo comando esegue l'app in  modalità dev . La modalità Dev consente di eseguire l'applicazione con il suo complemento completo di librerie installate, ma senza bisogno di essere formalmente impacchettato per la consegna. La maggior parte delle volte, durante lo sviluppo dell'applicazione, la testerai con la modalità sviluppatore. Se le dipendenze sono cambiate dall'ultima volta che è stato eseguito  dev, utilizzare il  -d flag per aggiornarle.
  • build: Crea una copia dell'applicazione nella forma necessaria per comprimerla per la distribuzione. Questo differisce dal fatto  dev che puoi costruire per piattaforme diverse se è installato il ponteggio.
  • update: Aggiorna una build dell'applicazione. Questo è il modo rapido per assicurarti che la build della tua applicazione abbia il codice più recente, invece di usare  build, che rigenera molti più file. Passa il  -d flag per aggiornare le dipendenze e il  -rflag per aggiornare le risorse (ovvero per copiare le risorse dalla versione dev della tua app alla versione build).
  • run: Esegue la versione incorporata dell'app. Questo essenzialmente simula l'esecuzione della versione pacchettizzata e distribuita dell'applicazione. Passa il  -u flag per aggiornare qualsiasi codice prima di eseguire.
  • package: Crea un pacchetto di installazione dell'applicazione dalla versione compilata dell'app. Il risultato finale di questo è un artefatto che puoi dare ad altri per installare il tuo programma, ad esempio un .MSI su Windows.

Di seguito sono riportati alcuni dei comandi Briefcase meno comunemente utilizzati: 

  • create: Da non confondere con  newcreate crea lo scaffolding per un programma di installazione dell'applicazione, un modo per creare il programma di installazione dell'app per una particolare piattaforma. Quando configuri un'app con  new, viene fornita con impalcature per la piattaforma su cui stai lavorando; create ti consente di aggiungere scaffolding per un'altra piattaforma, se necessario. 
  • upgrade: Aggiorna i componenti utilizzati per creare il pacchetto dell'app, come il framework Wix.
  • publish: Pubblica l'app in pacchetto su un canale di pubblicazione come un app store. (Al momento della stesura di questo articolo, questa funzione non funziona ancora.)

Per riassumere, questo è l'ordine in cui useresti i comandi Briefcase nel tipico ciclo di vita dell'app:

  • new per creare l'app
  • dev per eseguire l'app mentre ci lavori
  • build per creare una versione dell'app da impacchettare per la distribuzione
  • run per testare la versione in pacchetto dell'app
  • update per mantenere la versione pacchettizzata dell'app aggiornata con le modifiche al codice
  • package per distribuire la versione pacchettizzata dell'app con un programma di installazione

Creazione di app valigetta

Creare un programma Python come app Briefcase è molto simile alla creazione di qualsiasi altra app Python. Le questioni principali riguardano la struttura del progetto. Il punto di ingresso dell'app si trova  __main__.py nella directory dell'app, che viene caricata  app.py dalla stessa directory ed eseguita  main(). Quando si inizializza un progetto, verrà popolato con versioni segnaposto di alcuni file di progetto, che è possibile creare o sostituire secondo necessità.

Se stai trasformando un   progetto esistente per utilizzare Briefcase, assicurati di strutturarlo in modo tale che il suo punto di ingresso sia quello che si aspetta Briefcase. Ad esempio, se non hai memorizzato il codice in una  src directory, dovrai spostare il codice  src e correggere eventuali incompatibilità nei suoi percorsi e nelle strutture delle directory.

L'altra cosa da tenere a mente è come gestire le dipendenze di terze parti. Il  pyproject.toml file nella directory del progetto controlla quali dipendenze aggiungere al progetto. Se il tuo progetto ha un nome  myprojectpyproject.toml conterrà una sezione denominata  [tool.briefcase.app.myproject], con una  requires riga che elenca ogni requisito così come sarebbe specificato in un  requirements.txt file. Se il tuo progetto richiede, ad esempio,  regex e  black, dovresti impostare quella riga su  requires = ["regex","black"]. Dovresti quindi utilizzare  briefcase dev -d per aggiornare le dipendenze per la versione di sviluppo del progetto e  briefcase update -d per aggiornare le dipendenze nella versione pacchettizzata.

Confezione e consegna della valigetta

Una volta eseguito  briefcase package, vedrai apparire un ridistribuibile per il tuo programma in una sottodirectory della directory del progetto che corrisponde alla piattaforma per cui hai costruito. Per Microsoft Windows, ad esempio, la directory sarà  windowse il ridistribuibile sarà un  .msi file con lo stesso nome del progetto. Per Android e iOS, i risultati saranno progetti per Gradle e Xcode, rispettivamente, e questi dovranno essere compilati utilizzando questi strumenti per essere distribuiti su quelle piattaforme.

Come fare di più con Python

  • Come eseguire Anaconda fianco a fianco con altri Pythons
  • Come usare le dataclass Python
  • Inizia con async in Python
  • Come usare asyncio in Python
  • 3 passaggi per una revisione asincrona di Python
  • Come utilizzare PyInstaller per creare eseguibili Python
  • Tutorial Cython: come velocizzare Python
  • Come installare Python in modo intelligente
  • Come gestire i progetti Python con Poetry
  • Come gestire progetti Python con Pipenv
  • Virtualenv e venv: spiegazione degli ambienti virtuali Python
  • Python virtualenv e venv cosa fare e cosa non fare
  • Spiegazione del threading e dei sottoprocessi di Python
  • Come utilizzare il debugger Python
  • Come usare timeit per profilare il codice Python
  • Come usare cProfile per profilare il codice Python
  • Come convertire Python in JavaScript (e viceversa)