...E adesso dove clicco?

Dopo aver scritto una lunga guida per principianti su come installare e usare Python su Windows... mi rendo conto che forse ancora non basta, o che forse non ho colpito il centro del bersaglio. Provo a rimediare. (Nota successiva... nel frattempo la lunga guida è diventata un libro, e nel libro parlo in modo più completo anche dell'argomento di questo articolo...)
Il punto, mi sembra, è che il principiante assoluto in genere riesce a installare Python con una certa facilità: dopo tutto, è solo un installer! si scarica! si fa doppio clic! funziona! Dopo di che, tutto diventa improvvisamente più difficile. Magari il principiante ha in mente Visual Basic, o chissà forse Delphi, e si aspetta in sostanza un RAD vecchio stile, o un ambiente "low code" come si preferisce dire oggi: un bel programma grafico dall'aspetto amichevole dove progettare visualmente il layout di una finestra con pulsanti, caselle di testo... Ma Python non ha niente di tutto questo (non è niente di tutto questo, a dire il vero).

Quindi il principiante resta bloccato e si chiede: ...e adesso dove clicco?

Che cosa è Python (e che cosa non è).

Se avete installato Python per conto vostro, senza fare attenzione al significato di tutte le opzioni e senza aver seguito passo-passo una guida ragionata, allora ci sono già discrete probabilità che abbiate sbagliato qualcosina che verrà poi a tormentarvi dopo. Ma poco male, tutto sommato.
Adesso però si pone il problema di che cosa farci, con questo Python. Certo, Python è un linguaggio di programmazione: ma l'esperienza pratica di lavorare con Python è molto diversa da quella che offrono tool visuali come questo, o questo, o questo. Programmare in Python assomiglia probabilmente più a questo, o a... questo forse. Non è che non sia possibile programmare finestre, pulsanti, menu e caselle di testo in Python: ma Python stesso, lui, non offre questo tipo di interfaccia più "amichevole".
Perché? Beh, perché Python in primo luogo non è nato con quella mentalità e quella finalità in testa. Anche se è possibile programmare più o meno qualunque cosa in Python, comprese quindi le interfacce grafiche e i videogames, Python è nato e cresciuto soprattutto nella comunità degli hacker Unix/Linux, come concorrente di Perl per creare script e programmi server-side, o di Java per creare applicazioni business-oriented.

Python è un programma a riga di comando.

E ripeto per maggior chiarezza: Python è un programma a riga di comando. L'esperienza pratica di lavorare con Python è quella di aprire una shell del sistema operativo e avviare Python con le opzioni corrette. Se foste utenti Linux, questa cosa probabilmente non vi sconvolgerebbe più di tanto. Ma nel mondo Windows, per gli utenti "normali", è raro avere a che fare con la shell e i programmi a riga di comando. Quindi tanto vale cominciare a farsi un po' di pratica, no?
La shell storica di Windows è cmd.exe. A dire il vero si tratta di una shell molto limitata, e ormai da tempo PowerShell è un'alternativa preferibile. Tuttavia per lavorare con Python cmd.exe è più che sufficiente. Per aprire la shell ci sono molti modi: potete usare la combinazione di tasti win+x per mostrare il menu di sistema, scegliere "Esegui", e quindi inserire cmd e dare "invio". Se non avete proprio mai lavorato con la shell, forse vi conviene cercare in rete una guida (come questa, per esempio).
La cosa importante da tenere a mente è la nozione di "directory corrente", o "directory di lavoro": è la directory (la "cartella", come si dice tra niubbi Windows) a cui punta in quel momento il prompt della shell. Per esempio, è probabile che all'inizio la directory corrente sia qualcosa come C:\Users\vostro_nome>.Potete cambiare la directory corrente con il comando cd e "navigare" in questo modo nell'albero del file system. La nozione di directory corrente è importante perché l'indicazione di questa directory è "passata" a Python quando viene avviato dalla shell. In pratica Python, mentre è in esecuzione, "sa" qual è la directory corrente della shell che lo ha invocato e occasionalmente ne fa utilizzo. Per esempio, quando Python deve accedere a una risorsa esterna (aprire un file di testo per leggerne il contenuto, per dire) allora risolve la path di quella risorsa relativamente alla directory corrente.

Usare Pyhton in modo interattivo.

Se siete riusciti ad aprire una shell, allora basta inserire python e dare "invio" per aprire Python in modalità interattiva. Non importa in quale directory di lavoro siete: Python è nella PATH di sistema, quindi Windows trova sicuramente il suo eseguibile e... lo esegue, naturalmente.
La modalità interattiva è il modo più semplice e immediato per usare Python: in pratica Python vi offre un prompt dei comandi (molto riconoscibile e caratteristico: ">>>"). Voi inserite un comando valido, date "invio" e Python valuta immediatamente il comando e fornisce la risposta (quando è il caso - oppure non fa nulla di visibile, dipende dal comando). Provate per esempio:
>>> 2 + 2
4
>>> print('ciao')
ciao
>>> a = 10
>>> a / 2
5

Notate che se provate questo:
>>> import os
>>> os.getcwd()

Python vi dice qual è la directory corrente che ha ricevuto dalla shell al momento di essere invocato. Se adesso provate per esempio ad aprire un file di testo:
>>> open('test.txt', 'r')
Questo vi restituisce un errore se effettivamente non esiste un file test.txt nella stessa directory corrente.
Per uscire dal prompt di Python, inserite exit() e "invio".

Se adesso guardate nel Menu Avvio, una delle voci che l'installazione di Python ha aggiunto si chiama "Python 3.7 (64bit)" o qualcosa del genere: non è altro che una normale shell in cui è già stato avviato Python. Potete usare quella, se preferite cliccare sulle icone invece di aprire una shell per conto vostro e avviare manualmente Python. Lo svantaggio però è che non potete controllare la directory corrente, e che non potete fare uso dei fondamentali virtual environments.

Usare Python per eseguire uno script.

L'altra modalità in cui potete usare Python è per eseguire una script. Uno script è un normale file di testo "puro" che contiene una serie di istruzioni Python (possibilmente valide!) che verranno eseguite una dopo l'altra in una volta sola. Per scrivere uno script potete usare un editor di testo a vostra scelta (con l'esperienza imparerete a capire quale vi piace di più). Il nome del file deve terminare con l'estensione ".py".
Per eseguire lo script, occorre invocare Python dalla shell passando come argomento lo script da eseguire. Per esempio,
> python mioscript.py
Naturalmente in questo modo "mioscript.py" deve essere nella directory corrente al momento di avviare Python. In alternativa potete specificare il percorso completo dello script da avviare:
> python C:\percorso\completo\di\mioscript.py
o ancora, una path relativa alla directory corrente:
> python percorso\relativo\di\mioscript.py
Quindi, per esempio, se avete uno script in C:\Users\vostro_nome\Documents\scripts\mioscript.py, potete aprire una shell e
> cd C:\Users\vostro_nome\Documents\scripts
C:\Users\vostro_nome\Documents\scripts> python mioscript.py

oppure qualcosa del genere:
> cd C:\Users\vostro_nome\Documents
C:\Users\vostro_nome\Documents> python scripts\mioscript.py

Se il vostro script produce un output (per esempio a seguito di un print nello script), voi vedrete l'output nella shell da cui avete avviato lo script.

Ma... io volevo CLICCARE!?!

Eh, purtroppo vi è andata male. Certamente ci sono modi di esecuzione più "cliccosi" ma paradossalmente sono anche più complicati (nel senso: in apparenza più semplici, ma nascondono delle trappole che dovete conoscere alla perfezione).
Quello che però dovete capire fin dal principio è che in Python non esiste un "ambiente grafico di esecuzione" predefinito per gli script. Potete sicuramente configurare il vostro editor/IDE per eseguire script Python in modo più "amichevole", ma questo dipende da voi, dal vostro editor, dalle vostre necessità. Di per sé, Python non offre niente del genere all'inizio. L'ambiente di esecuzione predefinito di Python è la shell del sistema operativo.

Se avete letto una delle migliaia di guide dozzinali che si trovano in giro, e che incoraggiano il principiante a eseguire uno script "facendo doppio clic", o "premendo F5 da IDLE" (ci arriviamo...), ecco: quelle guide vi stanno portando fuori strada. Soprattutto i principianti dovrebbero invece impratichirsi con il vero ambiente di esecuzione di Python: la shell.
La shell vi permette di tenere sotto controllo quattro aspetti fondamentali:
1) la directory corrente da passare a Python;
2) il virtual environment dentro cui eseguire lo script;
3) lo standard input/output/error (che non hanno bisogno di essere re-indirizzati con strane manovre);
4) eventualmente le variabili d'ambiente che accompagnano l'esecuzione dello script, anche se questo all'inizio non dovrebbe impensierirvi molto.
Sicuramente ci sono modi per controllare tutto questo anche in altri ambienti di esecuzione (editor etc.): ma si tratta di sovra-strutture che mascherano la "verità" della shell, e quindi dovete fare la fatica ulteriore di capire come il vostro ambiente di esecuzione si comporta rispetto a questi quattro aspetti.

Tutti i problemi (che vedete in giro sui forum o che avete voi stessi) del tipo "quando avvio lo script in Anaconda funziona ma con Idle no, però poi se faccio doppio clic allora succede una cosa ma se invece sposto lo script succede un'altra cosa..." hanno una sola e semplice risposta:
- se non stai usando la shell per lavorare con Python, allora impara prima a usare la shell.

E Idle, allora? 

Ecco, Idle. Se posso permettermi un giudizio personale (sul mio blog!) - non usate Idle, punto. Idle è un discreto IDE, e ha il vantaggio (l'unico) di essere incluso nell'installazione di Python. Per il resto, è abissalmente indietro rispetto alle feature che anche un "normale" editor (SublimeText, Visual Studio Code...) può offrire oggi... per non parlare ovviamente dei super-editor (Vim, Emacs...) e dei super-IDE (Visual Studio, Eclipse...). Vale la pena di investire un po' di tempo, fin da subito, a imparare a usare un buon editor, e saltare completamente la "fase-Idle".

Detto questo, Idle esiste e se volete potete usarlo. Potete raggiungerlo comodamente dal Menu Avvio (è un'altra delle voci che vengono aggiunte dall'installazione) e presenta una shell Python (quella col prompt >>>, ricordate) in una veste grafica un po' più confortevole di quella offerta dalla comune shell di sistema cmd.exe.
Idle comprende anche un editor (accessibile dal menu "File -> New File") per comporre i vostri script... nonché un ambiente di esecuzione che si ottiene semplicemente premendo "F5" (o scegliendo "Run" dal menu). Quando Idle esegue uno script, lo standard input/output/error viene re-indirizzato in una finestra della shell di Idle.

Se avete seguito fin qui, avrete già capito che Idle non vi offre tutto il controllo che una normale esecuzione dalla shell vi garantisce. Per cominciare, non potete passare una directory corrente a Python: l'unica è cambiarla "da dentro" Python con os.chdir. Naturalmente non è possibile impostare le variabili d'ambiente né re-indirizzare l'output (anche qui, occorre lavorare "da dentro" con il modulo os).
Non è possibile impostare un virtual environment: se aprite Idle con il Menu Avvio, otterrete sempre e solo l'ambiente Python "di sistema". La soluzione a questo problema è leggermente più complessa. Occorre ricordare che, dopo tutto, Idle è esso stesso un programma (un modulo) Python: quindi, invece di eseguirlo con il Python di sistema, niente vieta di avviarlo con il Python di un virtual environment. Per esempio, se avete un virtual environment in C:\venvs\mio_venv, allora potete aprire una normale shell cmd.exe e dare:
> C:\venvs\mio_venv\scripts\python -m idlelib
per avviare una istanza di Idle con il Python del virtual environment. Se preferite avere qualcosa da cliccare, allora create una shortcut (un collegamento) magari sul desktop con quella riga di comando come target.
Il problema, naturalmente, è che questo andrebbe fatto per ogni singolo virtual environment che andrete a creare, perché Idle di per sé non ha un meccanismo per "applicarsi" a venv diversi.

Ma quindi, tu con che cosa lavori?

Mah, non è che importi poi molto: dovete capire come volete lavorare voi, non copiare cosa fa qualcun altro. In ogni caso, ho sempre usato SublimeText e più recentemente Visual Studio Code, ed entrambi comunque sempre con un certo giudizio. Per esempio, Visual Studio Code non ha nessun problema ad offrire al suo interno anche una shell Python, e anche un ambiente di esecuzione ("Esegui modulo...", quelle cose lì). Visual Studio Code è un editor "adulto": riconosce i virtual environment, gli ambienti "preparati" come Anaconda, è in grado di presentarmi super-shell come Jupyter Notebook... Ma se devo essere sincero, nove volte su dieci per eseguire i miei programmi e la shell Python preferisco ancora la vecchia cmd.exe. Uso ConEmu per mantenere organizzate le mie shell (è normale tenerne aperte più di una) e non ho problemi.

Ma l'utente finale...?

Ecco, questo è un discorso completamente diverso. Si capisce che l'utente finale del vostro programma, lui, dovrà avere una entry-point comoda... qualcosa su cui fare doppio clic, finalmente!
Ma intanto c'è una differenza tra Python e un programma scritto in Python. Voi, in quanto programmatori, siete utenti di Python, non di un programma Python. E Python, abbiamo visto, si usa in un certo modo.
Un programma Python, poi, ha tutto il diritto di avere un'installer personalizzato; un'interfaccia grafica; una bella icona; una bella icona su cui fare doppio clic!, eccetera. Questi però sono problemi di distribuzione e installazione dei programmi, e potete scommetterci che ci sono modi per affrontarli e risolverli anche nel mondo Python (se è questo tipo di programmi che vi interessa scrivere).

Ma intanto dovreste prima imparare, voi, come si usa Python per scrivere un programma. Il resto verrà.

Commenti

Post più popolari