Qualsiasi programmatore, indipendemente dagli strumenti che usa, sa quanto sia importante rendere fruibile agli utenti il proprio prodotto, che sia un software completo oppure una libreria. Python non fa eccezione, anzi, la popolarità di questo linguaggio la si deve in gran parte alla vasta disponibilità di librerie che implementano funzioni specifiche ed alla semplicità con cui possiamo renderle disponibili nel nostro sistema grazie a distutils.
Prima di vedere cos'è distutils e come si utilizza, è necessaria una breve digressione sul concetto di modulo e package che sarà sicuramente utile a chi si trova ancora alle prime armi con Python. Un modulo non è altro che un file contenente del codice Python:
# file: aritmetica.py def somma(a, b): return a+b
La cosa interessante è che altri moduli python possono utilizzare le funzionalità implementate nel modulo aritmetica, contenuto nel file aritmetica.py:
#file: main.py import aritmetica a = 38 b = 4 print "La risposta è", aritmetica.somma(a,b)
Un package, invece, è una cartella nel vostro filesystem che serve a contenere un insieme di moduli correlati per funzionalità ; per far sì che python veda la vostra cartella come un package basta inserirvi un file, anche vuoto, chiamato __init__.py. Volendo creare ad esempio un nostro package "matematica", il layout sul filesystem sarebbe questo:
matematica/ __init__.py artimetica.py algebra.py
Se il package è correttamente installato, è possibile utilizzarlo in questo modo:
#file: main.py import matematica a = 38 b = 4 print "La risposta è", matematica.aritmetica.somma(a,b)
Da notare che ora viene importato il package che contiene il modulo aritmetica e non il modulo stesso come nel caso precedente. Inoltre dobbiamo specificare il nome del package ogni volta che utilizziamo tale modulo.
I package possono avere una struttura complessa e spesso offrono una gamma di funzionalità molto ampia, pertanto è piuttosto frequente l'esigenza di distribuirli ad altri utenti affinché possano utilizzarli. A questo scopo ci viene in aiuto distutils, un package già incluso nella libreria standard di Python con il quale andremo a distribuire il nostro package matematica.
Nonostante distutils sia uno strumento potente e piuttosto complesso, per un package semplice come il nostro matematica tutta l'operazione si ridurrà alla implementazione di un solo modulo Python chiamato setup. La prima cosa da fare è creare una cartella contenente il package da distribuire ed il file setup.py:
matematica-dist/ setup.py matematica/ __init__.py artimetica.py algebra.py
Il modulo setup contiene tutta la logica necessaria per raccogliere i file (sorgenti Python ma anche file di licenza, eventuali immagini, icone, ecc.) e posizionarli correttamente nella macchina dove verrà distribuito il package nonché tutti i metadati ad esso associati come il nome, la versione, l'autore. Il nostro modulo setup sarà decisamente scarno e conterrà solo il seguente codice:
from distutils.core import setup setup(name = "matematica", version = "0.1", description = "Package di supporto alla matematica", author = "HTML.it", author_email = "info@somedomain.com", url = "http://blog.html.it", packages=["matematica"] )
A questo punto possiamo eseguire da terminale lo script di setup chiedendogli di creare un pacchetto per la distribuzione del nostro package:
# python setup.py sdist running sdist warning: sdist: manifest template 'MANIFEST.in' does not exist (using default file list) warning: sdist: standard file not found: should have one of README, README.txt writing manifest file 'MANIFEST' creating matematica-0.1 creating matematica-0.1/matematica making hard links in matematica-0.1... hard linking setup.py -> matematica-0.1 hard linking matematica/__init__.py -> matematica-0.1/matematica hard linking matematica/algebra.py -> matematica-0.1/matematica hard linking matematica/aritmetica.py -> matematica-0.1/matematica creating dist tar -cf dist/matematica-0.1.tar matematica-0.1 gzip -f9 dist/matematica-0.1.tar removing 'matematica-0.1' (and everything under it) #
Una volta terminata l'esecuzione dello script noterete la presenza di una cartella dist contenente il file matematica-0.1.tar.gz (notare che il nome del file viene composto utilizzando le informazioni contenute nel setup.py) che sarà quello che renderemo disponibile per il download da parte degli utenti. Tutto quello che dovrà fare un utente che intenda installare sulla propria macchina il nostro package sarà questa semplice sequenza di comandi da terminale:
# tar xzf matematica-0.1.tar.gz && cd matematica-dist # python setup.py install
E questo è tutto: distutils utilizzerà le informazioni contenute nel modulo setup e si occuperò di posizionare il nostro package nel posto giusto all'interno del sistema dell'utente. Se poi vogliamo rendere più agevole l'operazione agli utenti Windows, distutils ci consente di creare dei pacchetti autoinstallanti che non richiedono l'utilizzo del terminale. Basta lanciare il setup.py in questo modo:
# python setup.py bdist_wininst
In questo caso, terminata l'esecuzione dello script troverete nella cartella dist un eseguibile chiamato matematica-0.1.win32.exe che se eseguito lancerà il wizard dell'installer come in figura:
Per approfondire sia la parte di installazione che la parte di creazione dei pacchetti rimando alla consultazione della Guida al Packaging per Autostoppisti nonché alla documentazione ufficiale.