Python - Configurazione iniziale
Indice dei contenuti
Installazione #
Il modo più comodo che ho trovato per lavorare con Python su Windows è installarlo direttamente da https://www.python.org/downloads/, o tramite chocolatey.
Su Linux, invece, mi sto trovando bene con pyenv, che permette di gestire in modo abbastanza semplice più versioni di Python contemporaneamente in modo da non incasinarsi con le dipendenze.
Visual Studio Code #
Per lavorare su Python, Visual Studio Code è probabilmente l’IDE più comodo. Il setup è abbastanza spedito:
- Installare da https://code.visualstudio.com/
- Premere CTRL+SHIFT+X per aprire a sinistra il menu delle estensioni
- Cercare e installare l’estensione “Python”
Virtual Environment #
Sempre per evitare problemi di dipendenze in conflitto quando si installano pacchetti, la cosa più comoda da fare (per me) è lavorare su ambienti virtuali diversi per ogni progetto, in cui in ognuno si installa solo le dipendenze che servono in quel contesto lì.
Creare un venv #
- Aprire su VSCode la cartella root del progetto
- Premere CTRL+SHIFT+P per far comparire un prompt in alto al centro
- Scrivere “Create” e, quando appare, selezionate l’opzione “Python: Create Environment…”
- Selezionare “Venv”
- Verrà fuori l’elenco delle versioni di Python installate sul PC (che VSCode è riuscito a trovare). Da lì, selezionare quello installato a mano (sarà probabilmente quello in
C:\Python3XX\python.exe
) - Una volta terminato il caricamento, ci sarà una cartella “.venv” nella root del progetto (per vedere i file nella cartella attiva, premere CTRL+SHIFT+E)
Creare manualmente un venv #
Attenzione in questo caso che all’eseguibile python
che si sta usando.
python -m venv .venv
.\.venv\Scripts\activate
Se da errore all’attivazione dell’environment, apri un terminale Powershell come amministratore e dai il comando per abilitare l’esecuzione di script
set-executionpolicy remotesigned
Installare pacchetti in un venv #
Una volta creato un ambiente virtuale, sempre da VS Code in alto nel menu Terminal->New Terminal
. Dovrebbe aprirsi in basso un terminale e l’ambiente virtuale dovrebbe attivarsi in automatico.
A questo punto, si installano i pacchetti normalmente con il comando pip
. Ad esempio, volendo installare i pacchetti numpy e scipy (per conti scientifici), matplotlib (per i grafici) e gmsh:
pip install numpy scipy matplotlib gmsh
Visto che saranno comodi successivamente, conviene anche installare autopep8
(formattazione automatica del codice), ipywidgets
e ipykernel
(per i Jupyter Notebook).
pip install autopep8 ipykernel ipywidgets
Per installare pacchetti da repository Github, usare il comando del tipo
pip install git+https://github.com/USER/REPO.git
Nella mia esperienza, se si sposta una cartella contenente un venv questo non funziona più e tocca cancellare la cartella .venv
e ricrearlo da capo.
Jupyter Notebook #
I Jupyter Notebook sono comodi perchè permettono di far girare il codice “a blocchi” indipendenti e, volendo, di mettere della documentazione in markdown.
Per crearne uno su VSCode, basta creare un file con estensione .ipynb
. Aprendolo, si vede una cella vuota e, in alto a destra, la scritta “Select Kernel”.
Premere il tasto per selezionare il kernel, selezionare “Python Environments…” e dall’elenco che viene fuori scegliere il virtual environment creato apposta per questo progetto (nell’immagine, è .venv (Python 3.11.0)
; VSCode è abbastanza sveglio da segnarlo come Recommended).
A questo punto basta mettere codice nella cella vuota, e farlo girare con “Run All”.
Github Copilot #
Lo si può avere gratis con l’account studente iscrivendosi con la mail dell’università dalla pagina dedicata.
Ulteriori informazioni su come si installa e usa nella guida ufficiale.
Anaconda #
Io non mi ci sono trovato bene, soprattutto nei casi in cui c’è necessità di installare pacchetti strani e non direttamente disponibili dai repository ufficiali. Comunque in caso che serva i comandi principali sono quà.
Installare pacchetti #
Se disponibili, preferire sempre conda install PACCHETTO
a pip. Altrimenti, guarda la sezione successiva.
Anaconda con pip #
Per installare pacchetti su un environment anaconda non disponibili con conda install
(es. gmsh
, fortls
), non bastare usare pip
a caso perchè finisci per installarlo globalmente e fare danni.
Quindi, immaginando di partire proprio da zero, dalla shell di anaconda:
conda create -n MYENV
conda activate MYENV
conda install pip
cd $($env:USERPROFILE)\anaconda3\envs\MYENV\Scripts
.\pip.exe install PACCHETTO
Quindi per installare un pacchetto locale, dovrai usare al posto di PACCHETTO
il percorso alla cartella con il modulo locale, aggiungendo anche -e
.
Trick utili #
Passare all’interactive shell appena finito lo script #
Su Linux
PYTHONSTARTUP=some_script.py python -i
Su Windows Powershell
$env:PYTHONSTARTUP = 'some_script.py'; python -i ; Remove-Item Env:\PYTHONSTARTUP;
Moduli globali #
Per rendere importabili da ovunque i moduli in una cartella globale:
- Metti in fondo agli script della cartella globale il check
if __name__ == "__main__":
pass
- Nella cartella
site-packages
di Python aggiungi un file con estensione.pth
contenente la cartella con i moduli- Per anaconda la cartella è in
C:\Users\<NOME UTENTE>\anaconda3\envs\<NOME ENV>\Lib\site-packages
- Per anaconda la cartella è in
Installare un pacchetto da cartella #
- Spostarsi nella cartella root del pacchetto (quella contenente
setup.py
) - Aprire da terminale l’environment Python su cui si vuole installare
- Dare il comando
pip install -e .
Creare un pacchetto #
Struttura la cartella in modo che si abbia
root/
setup.py
package_name/
__init__.py
module1.py
module2.py
Dove __init__.py
è un file vuoto, mentre setup.py
contiene codice del tipo
import setuptools
setuptools.setup(name='vutils',
version='1.0',
description='Useful stuff',
url='#',
author='av',
install_requires=['numpy'],
author_email='',
packages=setuptools.find_packages(),
zip_safe=False)
Su Github (o quello che è) serve caricare soltanto questa struttura di file, se metti anche build e egg info fai danni perchè non aggiorna bene.
Note #
Quando fai un modulo aggiungi in fondo ai file
if __name__ == "__main__":
pass
Snippets #
Padding stringhe #
>>> strlength = 15
>>> string = "John"
>>> f"{string:<{strlength}}"
'John '
>>> f"{string:>{strlength}}"
' John'
>>> f"{string:^{strlength}}"
' John '
Progress bar #
def pb_init(text:str) -> int:
print(text, end='', flush=True)
return 0
def pb_update(iter:int, total:int, old_nbars:int, length:int = 40) -> int:
nbars = int(length * iter // total)
ten = length // 10
for i in range(old_nbars, nbars):
imod10 = i % ten
if (imod10 == 0 and i != 0):
print(i // ten * 10, end='')
print('-', end='')
if iter == total:
print(100)
print("", end="", flush=True)
return nbars
# Utilizzo
old_nbars = pb_init('Elaborazione |')
for i in range(0, 15):
# elaborate()
old_nbars = pb_update(old_nbars, i, 14, length=40)