Corso di programmazione Python su Flip&Click: script porting

Eccoci di nuovo insieme per un nuovo capitolo del nostro corso di programmazione in Python. Nelle scorse puntate abbiamo affrontato diversi temi che avevano a che fare dapprima con i microcontrollori ed i DAC, poi più specificatamente con i sensori ed il loro interfacciamento. Oggi abbiamo deciso di dedicare la puntata ad un aspetto di questo linguaggio che abbiamo sempre accennato ma mai trattato nel dettaglio, ovvero la portabilità. Che cosa significa effettivamente? Come funziona? Quali sono i risvolti pratici di questa caratteristica? Lo vediamo oggi attraverso un esempio che proveremo a far funzionare su diversi sistemi operativi, Windows e Unix. Buona lettura.

Introduzione

Quando si programma, l'obiettivo è quello di immaginare un algoritmo che sia in grado di svolgere tutti i compiti "assegnati" in maniera precisa ed ordinata. Il paradigma di programmazione prevede che prima di tutto il software venga specificato in ogni funzione, a partire dai requisiti. Successivamente è necessario che si scriva l'elenco delle funzioni che si prevede di implementare, legate tra di loro in maniera funzionale. A valle di tutto questo si potrà certamente iniziare a buttar giù righe di codice nel linguaggio di programmazione prescelto.

Chi già lavora con i microcontrollori sa che il C è senza dubbio il linguaggio di programmazione più utilizzato, perché semplice ed efficace. In altri ambiti è possibile utilizzare paradigmi di programmazione simili a quelli del C ma con sintassi differenti. Il C, in particolare, è il classico esempio di linguaggio in grado di potersi adattare a diversi microcontrollori. Sebbene, infatti, le librerie ed i codici che vengono scritti non siano effettivamente portabili perché ciascun microcontrollore prevede quanto meno indirizzi diversi per i registri di memoria, se non addirittura politiche di accesso differenti, è vero però che il linguaggio risulta sempre utilizzabile.

Il paradigma della portabilità prevede, invece, che il codice scritto si astragga dalla specifica piattaforma hardware. Per poter fare questo è necessario che l'accesso alle singole risorse oppure ai metodi comuni e condivisi, sia interpretato, ovvero servono delle librerie specifiche. Ora che abbiamo inquadrato il problema, entriamo nel concreto e vediamo un esempio a partire da alcune librerie Python che si rivelano incredibilmente utili.

Le librerie che servono

import os

Molti codici che abbiamo visto insieme fino a questo momento hanno incluso questa libreria il cui nome, è facilmente intuibile, richiama il sistema operativo. Il suo scopo è, infatti, quello di consentire all'utente di accedere alle funzioni più comuni. Lo vediamo con quelle richiamate in questo elenco:

  • os.chdir(path) - consente di cambiare la directory di lavoro e accetta come parametro il percorso completo che può essere indicato sia come assoluto sia come relativo;
  • os.fchdir(fd) - consente di cambiare la directory di lavoro corrente;
  • os.getcwd() - restituisce una stringa che indica la directory di lavoro corrente;
  • os.ctermid() - restituisce il filename che corrisponde al terminale di controllo del processo,
  • os.getegid() - restituisce il group id del processo corrente, che corrisponde al bit “set id” del file che viene seguito nell'ambito del processo corrente;
  • os.geteuid() - restituisce lo user id del processo corrente;
  • os.getgroups() - restituisce la lista di tutti i group ids associati al processo corrente;
  • os.access(path, mode) - utilizza l'uid/gid per effettuare un test di accesso al percorso. Va notato che la maggior parte delle operazioni che possono essere effettuate tiene conto dei parametri uid/gid e pertanto questo specifico comando può essere utilizzato in diversi ambienti per testare l'accesso a cartelle differenti. Il parametro "mode" dovrebbe essere F_OK per poter effettuare il test dell'esistenza del percorso oppure dovrebbe includere OR (R_OK, W_OK o X_OK) per verificare il test dei permessi di accesso alle cartelle. Restituisce "True" se l'accesso è consentito, "False" se, invece, non lo è.
  • os.stat(path) - si tratta di un'operazione del tutto analoga a stat(), chiamata del sistema su uno specifico percorso. I valori che può restituire dipendono dagli attributi, ed in particolare abbiamo:
    • st_mode - bit di protezione;
    • st_ino - inode number;
    • st_dev - device;
    • st_nlink - numero di hard links;
    • st_uid - user id dell'owner;
    • st_gid - group id dell'owner;
    • st_size - dimensione del file (misurata in byte);
    • st_atime - timestamp relativo all'accesso più recente;
    • st_mtime - timestamp relativo all'attività di modifica dei contenuti più recente;
    • st_ctime - (platform dependent) istante di tempo della modifica ai metadata più recente, su sistema Unix, oppure istante di tempo di creazione, su sistema Windows;

Nota Bene: l'esatto significato e la corretta sintassi e risoluzione di attributi come st_atime, st_mtime e st_ctime dipendono dal sistema operativo e più specificatamente dal file system. Ad esempio, infatti, su sistemi Windows che utilizzano FAT o FAT32, st_mtime ha una risoluzione di due secondi [...]

Iscriviti e ricevi GRATIS
Speciale Pi

Fai subito il DOWNLOAD (valore 15€) GRATIS

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2579 parole ed è riservato agli abbonati PLATINUM. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici MAKER e PLATINUM e potrai fare il download (PDF) di tutti gli EOS-Book, Firmware e degli speciali MONOTEMATICI. ABBONATI ORA, è semplice e sicuro.

Abbonati alle riviste di elettronica

Una risposta

  1. Maurizio Di Paolo Emilio Maurizio Di Paolo Emilio 17 febbraio 2017

Scrivi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Iscriviti e ricevi GRATIS
Speciale Pi

Fai subito il DOWNLOAD (valore 15€) GRATIS