Salta al contenuto principale

Python - Configurazione iniziale

·5 minuti

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:

  1. Installare da https://code.visualstudio.com/
  2. Premere CTRL+SHIFT+X per aprire a sinistra il menu delle estensioni
  3. Cercare e installare l’estensione “Python”

Alt text

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 #

  1. Aprire su VSCode la cartella root del progetto
  2. Premere CTRL+SHIFT+P per far comparire un prompt in alto al centro
  3. Scrivere “Create” e, quando appare, selezionate l’opzione “Python: Create Environment…”
    Imgur
  4. Selezionare “Venv”
    Alt text
  5. 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)
    Alt text
  6. 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)
    Alt text
    Alt text

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.

Alt text

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”.

Alt text

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).

Alt text

A questo punto basta mettere codice nella cella vuota, e farlo girare con “Run All”.

Alt text

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:

  1. conda create -n MYENV
  2. conda activate MYENV
  3. conda install pip
  4. cd $($env:USERPROFILE)\anaconda3\envs\MYENV\Scripts
  5. .\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:

  1. Metti in fondo agli script della cartella globale il check
if __name__ == "__main__":
    pass
  1. 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

Installare un pacchetto da cartella #

  1. Spostarsi nella cartella root del pacchetto (quella contenente setup.py)
  2. Aprire da terminale l’environment Python su cui si vuole installare
  3. 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)