lunedì 30 dicembre 2013

Risorse Python: aggiornamento 8 - differenze Python 2.x/3.x

Nell'ottavo aggiornamento della pagina Risorse Python del blog ho inserito link a materiale sulle differenze tra Python 2.x e 3.x, uno dei problemi che lo sviluppatore Python prima o poi si trova ad affrontare nell'attuale fase di transizione fra le due versioni.

Aggiornamenti anche per la sezione Esempi di codice con un po' di snippet di pronto intervento quando non ricordate qualche aspetto base del linguaggio.


sabato 28 dicembre 2013

Risorse Python: aggiornamento 7 - tutorial PyMOTW anche in italiano

Settimo aggiornamento per la pagina Risorse Python del blog con l'inserimento di Python Module of the Week, noto anche come PyMOTW, un tour guidato sulla Python Standard Library creato da Doug Hellmann.

Ricco di spiegazioni semplici e dettagliate, accompagnate da abbondanti esempi di codice, lo mettono alla portata anche di chi conosce solo le basi di Python e vuole passare al gradino successivo del suo apprendimento. E se l'inglese non è il vostro forte, c'è una versione italiana di PyMOTW.

Viste le caratteristiche, aggiunto sia nella sezione Libri inglese - da altri linguaggi che nella sezione Tutorial.

martedì 17 dicembre 2013

Come aggiornare Pyenv

Dopo aver configurato Python a livello locale, non vi resta che tenere aggiornata l'installazione di pyenv. Il suo aggiornamento si rende necessario quando:
  • sono stati corretti dei bug;
  • è disponibile una nuova versione di Python.
In questo secondo caso ve ne potete rendere conto dal fatto che chiedendo la lista delle versioni Python disponibili per l'installazione, la nuova versione non risulta nell'elenco.

Per procedere con l'aggiornamento di pyenv, aprite un terminale e date i comandi:

cd ~/.pyenv
git pull


Tutto qui, avete finito.

Tenete solo presente una cosa: se la nuova versione continua a non apparire anche dopo l'aggiornamento, significa che lo sviluppatore di pyenv può non aver ancora fatto in tempo ad aggiornare il repository dell'applicazione. Riprovate successivamente.

lunedì 16 dicembre 2013

Risorse Python: aggiornamento 6 - Tkinter

Sesto aggiornamento per la pagina Risorse Python del blog interamente dedicato a Tkinter, l'interfaccia Python standard a Tk, il toolkit per interfacce utente grafiche (GUI).

Guide, tutorial e reference per Tkinter di cui oltre la metà sono in italiano, le prime nella lista, e tutte comunque liberamente scaricabili/consultabili in rete.

venerdì 13 dicembre 2013

Configurazione di Python tramite pyenv a livello di shell

Nel post precedente ci siamo occupati della configurazione di Python con pyenv a livello locale, cioè della versione di Python da avviare al livello di una specifica directory.

In questo post invece ci occupiamo dell'ultima e più specifica di tutte le impostazioni che pyenv vi permette, quella a livello di shell (terminale): grazie ad essa potete specificare quale versione di Python usare a livello di ogni singolo terminale che aprite sul vostro sistema.

Lo fate tramite il comando

pyenv shell 3.3.3

che ad esempio imposta l'uso di Python 3.3.3 per la sola shell corrente, sovrascrivendo quindi sia le impostazioni a livello globale, sia a livello locale eventualmente già configurate.

Come sempre si possono impostare più versioni di Python contemporaneamente con

pyenv shell 2.7.6 3.3.3

mentre

pyenv shell

senza ulteriori indicazioni restituisce le versioni di Python attive nella shell corrente:

2.7.6:3.3.3

Non si tratta di un errore, le versioni attive in questo caso sono visualizzati in questo modo un po' diverso dal solito.

Le impostazioni valgono per quella shell finché resta aperta. Una volta chiusa tutte le impostazioni andranno perse e resteranno attive solo quelle globali e locali perché queste sono registrate su file, rispettivamente nel file ~/.pyenv/version per quella globale, e nel file .pyenv-version della directory corrente per quella locale.

Se volete annullare le impostazioni fatte finora senza chiudere la shell usate

pyenv shell --unset

e riprenderanno a funzionare le impostazioni locali se precedentemente configurate, altrimenti quella globale.

giovedì 12 dicembre 2013

Configurazione di Python tramite pyenv: livello locale

In questo post continuiamo la chiacchierata iniziata in quello precedente parlando della configurazione di Python tramite pyenv a livello locale.

Immaginate un vostro progetto che ha bisogno di usare una specifica versione di Python differente da quella globale: potete impostare questa versione perché si avvii solo nella directory che ospita il vostro progetto, in tutte le altre continueranno ad avviarsi le solite versioni.

Questo vuol dire che le impostazioni locali prevalgono su quelle globali, tenetelo sempre a mente.

Per impostare Python a livello locale si usa il comando

pyenv local 2.7.6

che ad esempio imposta Python 2.7.6 per la directory corrente.

Il comando fa anche altro: crea se non esiste, altrimenti lo aggiorna, il file .pyenv-version e dentro vi scrive una stringa uguale alla versione di Python da avviare in quella directory, in questo caso sarà "2.7.6".

Ogni volta che avvierete Python, pyenv controllerà prima la presenza di questo file nella directory corrente, se lo trova avvierà la versione corrispondente a quella stringa. Se non trova il file si rifà invece alle impostazioni globali.

Esattamente come a livello globale si possono impostare più versioni di Python anche a livello locale:

pyenv local 2.6.9 2.7.6

Invece il comando

pyenv local

senza ulteriori parametri, restituisce la/le versioni correntemente attive di Python per la directory corrente:

2.6.9                     
2.7.6

Se volete eliminare la configurazione locale di una directory, aprite il terminale in quella directory e date il comando:

pyenv local --unset

E anche per il livello locale è tutto. Nel prossimo post si parlerà invece dell'ultimo livello di controllo, quello più fine che pyenv permette: stabilire quale/quali versioni di Python avviare a livello di singola shell.

lunedì 9 dicembre 2013

Risorse Python: aggiornamento 5 - Git

Quinto aggiornamento per la pagina "Risorse Python" del blog con l'aggiunta, nella sezione Version Management, di Git, il sistema di versioning distribuito creato da Linus Torvalds, il padre di Linux.

Per coloro che hanno bisogno di documentazione sul come usarlo, ho aggiunto i link ad un paio di guide davvero carine e tradotte anche in italiano, più altre in inglese ed un paio di Cheat Sheet molto comodi per la consultazione veloce quando non ricordiamo un comando o la sequenza di comandi da usare nel nostro flusso di lavoro.

Per chi invece cerca qualcosa di più corposo c'è il libro "Pro Git" di Scott Chacon, ed il link alla guida che ho scritto sul forum di Python per averne una versione ePub o Mobi (per Kindle Fire) anche in italiano.

giovedì 5 dicembre 2013

Configurazione di Python tramite pyenv: livello globale

Nel post sull'installazione di Python con Pyenv avete installato quattro diverse versioni di Python. La sola installazione non è però sufficiente per poterle usare con i vostri programmi, dovete prima configurarle: vediamo come.

Pyenv è così elastico nelle configurazioni da poter scegliere quante e quali versione di Python usare, e sopratutto, a quale livello:
  • livello globale, cioè in tutte le shell (terminali);
  • livello locale, cioè quando il terminale si trova in una specifica directory. Sovrascrive la scelta globale;
  • livello di singola shell. Vale solo nella shell corrente, quella che state usando, e sovrascrive tutte le scelte precedenti.
In questo post ci occuperemo di configurare Python a livello globale, per gli altri livelli ci saranno post dedicati.

Per la configurazione a livello globale si usa il comando

pyenv global 2.7.6

che ad esempio imposta a livello globale l'uso di Python 2.7.6.

Il comando crea inoltre, se non esiste già, il file ~/.pyenv/version. Al suo interno pyenv vi scrive il numero di versione di Python che volete usare a livello globale.

Quello che fa è semplicemente aggiungere nel file una stringa, in questo caso "2.7.6", in modo che quando invocherete nuovamente Python in un terminale qualunque (da cui appunto globale), pyenv sa già quale versione avete impostato.

Per configurare più versioni di Python contemporaneamente, usate il comando pyenv global in questo modo:

pyenv global 2.6.9 2.7.6 3.2.5 3.3.3

Ecco, avete appena configurato il vostro sistema affinché a livello globale usi tutte le versioni di Python che avevate installato in pyenv seguendo le istruzioni del post precedente.

Se al comando pyenv global non fate seguire nulla, esso restituisce le versioni globali correntemente configurate:

pyenv global

2.6.9
2.7.6
3.2.5
3.3.3

Eccole lì, tutte le versioni installate sono presenti e pronte all'uso. Bene, facciamo qualche prova.

Avviate la versione 2.6 di Python:

python2.6

Python 2.6.9 (unknown, Nov 22 2013, 22:52:18) 
[GCC 4.6.3] on linux3
Type "help", "copyright", "credits" or "license" for more information.

Provate ora ad avviare la versione 2.7:

python2.7

Python 2.7.6 (default, Nov 26 2013, 10:15:44) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.

La 3.2:

python3.2

Python 3.2.5 (default, Dec  3 2013, 08:43:37) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.

La 3.3:

python3.3

Python 3.3.3 (default, Nov 22 2013, 09:28:26) 
[GCC 4.6.3] on linux
Type "help", "copyright", "credits" or "license" for more information.

Tutte rispondono all'appello.

Ma se avviate la generica versione 2 di Python, quale parte? La 2.6 o la 2.7? Controlliamo:

python2

Python 2.7.6 (default, Nov 26 2013, 10:15:44) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.

Parte quella più recente. E avviando la generica versione 3 quale parte? La 3.2.5 o la 3.3.3? Vediamo:

python3

Python 3.2.5 (default, Dec  3 2013, 08:43:37) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.

Questa volta parte la versione meno recente, la 3.2.5.

Ricapitolando: se viene chiamata la generica versione 2 di Python parte quella più recente, se invece viene chiamata la generica versione 3, parte la versione meno recente. Per non confondervi con questo comportamento di pyenv indicate sempre esplicitamente la versione di Python che volete avviare, per esempio:

python3.3

Per tornare ad usare la versione di default di Python, quella predefinita della vostra distribuzione che stavate usando prima di pyenv, basta dare il comando:

pyenv global system

"system" è un nome speciale che dice a pyenv di riprendere ad usare le versioni di default sul sistema, ed infatti se ora chiedete cosa è configurato a livello globale,

pyenv global

otterrete:

system

Riprovando ad avviare Python notate adesso i numeri di versione:

python2

Python 2.7.3 (default, Sep 26 2013, 20:03:06)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.

python3

Python 3.2.3 (default, Sep 25 2013, 18:22:43)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.

Sono cambiati, sono nuovamente Python 2.7.3 e 3.2.3, i default di Ubuntu 12.04 LTS, sul vostro sistema naturalmente ricomparirà la vostra versione precedentemente installata.

Anche per questa volta è tutto, ma le magie di pyenv non sono finite. Continueranno nel prossimo post dove ci occuperemo di configurare Python a livello locale, cioè a livello di singola directory.

Se ad esempio un vostro progetto ha bisogno di usare una specifica versione di Python differente da quella globale, potete configurare la versione necessaria solo per la directory che ospita il vostro progetto, a livello globale continueranno a funzionare le versioni già impostate.

martedì 3 dicembre 2013

Installazione di Python con Pyenv

Dopo aver visto come installare pyenv sul vostro sistema (se non l'avete fatto leggete il post, ci sono un po' di dipendenze da installare prima di procedere con le indicazioni che trovate qui), iniziamo finalmente ad usarlo per renderci ancora più facile e divertente la vita di sviluppatori Python.

Se vi state chiedendo perché mai pyenv dovrebbe avere tale effetto, allora non avete letto il post di presentazione di pyenv. Fatelo, vi aiuterà a chiarirvi le idee su cos'è e cosa fa.

In questo post vedremo invece come usare usare pyenv per installare una o più versioni di Python. Ma quali sono le versioni disponibili in pyenv? Chiedeteglielo:

pyenv install --list
Available versions:
  2.4
...
  2.4.6
  2.5
  2.5.1
...

  2.7.6
...
  3.3.3
  3.3-dev
...

  3.4.0b1
  3.4-dev
  jython-2.5.0
...
  pypy-1.5
...

  pypy3-2.1-beta1
  pypy3-2.1-beta1-src
...
  stackless-2.7.2
...

  stackless-3.3-dev
  stackless-dev


Come potete notare, nonostante la lista sia stata abbondantemente tagliata è comunque molto lunga. Si parte da Python 2.4 risalente al 2004, fino al 3.4 ancora in fase di sviluppo nel momento in cui scrivo, passando per versioni particolari come PyPy.

Fate attenzione: potrebbe accadere che sia stata rilasciata una nuova versione di Python eppure nella lista non c'è. Ci possono essere 2 motivi per cui questo accade:
  1. è già da un po' che avete installato pyenv sul vostro computer ed è ora di aggiornarlo;
  2. la nuova versione è stata appena rilasciata. In questo caso date prima il tempo all'autore di aggiornare pyenv su github e poi tornate al punto 1.
Negli esempi che seguono installerete:
  • Python 2.6.9;
  • Python 2.7.6;
  • Python 3.2.5;
  • Python 3.3.3.
Perché così tante versioni? Perché ci serviranno per vedere tutte le caratteristiche di pyenv nei prossimi post, sopratutto quella che è il suo punto di forza: l'enorme flessibilità e facilità con cui riesce a gestire contemporaneamente più versioni di Python.

Aprite una shell (terminale) e iniziamo con l'installazione di Python 2.7.6 che avverrà nella directory ~/.pyenv della vostra home:

pyenv install 2.7.6

In modo del tutto automatico partirà il dowload e poi la compilazione dei sorgenti Python:

Downloading Python-2.7.6.tgz...
Installing Python-2.7.6...


Mettetevi comodi: a seconda della velocità della vostra connessione Internet e la potenza del vostro sistema, potrebbero servire anche diversi minuti per completare l'installazione di Python.

Ne approfitto per ricordarvi che il download non avviene dal sito ufficiale di Python, bensì dal mirror dedicato di pyenv.

Terminata l'installazione riceverete il messaggio

Installed Python-2.7.6 to ~/.pyenv/versions/2.7.6

che vi indica cosa è stato installato (Python-2.7.6) e dove (~/.pyenv/versions/2.7.6), e automaticamente parte anche l'installazione del bonus offerto da pyenv.

Si tratta dell'installazione di pip, il gestore di pacchetti Python che dalla versione 3.4 è disponibile di default:

Downloading setuptools-1.4.tar.gz...
-> https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.tar.gz
Installing setuptools-1.4...

Installed setuptools-1.4 to ~/.pyenv/versions/2.7.6

Downloading pip-1.4.1.tar.gz...
-> https://pypi.python.org/packages/source/p/pip/pip-1.4.1.tar.gz
Installing pip-1.4.1...

Installed pip-1.4.1 to ~/.pyenv/versions/2.7.6

Ora dovete informare pyenv dell'installazione del nuovo Python sul vostro sistema. Lo fate con il comando:

pyenv rehash

E con questo avete appena finito di installare Python 2.7.6. Facile, vero? Procedete allo stesso modo per installare anche Python 3.3.3 con il comando

pyenv install 3.3.3
pyenv rehash

poi proseguite con la 2.6.9 e la 3.2.5 e avete finito.

Pyenv è davvero potente e facile da usare! Potete finalmente installare tutte le versioni di Python che volete in pochi attimi. Potete pensare di usare finalmente sempre la versione più aggiornata senza doversi lanciare in compilazioni da sorgente litigando con dipendenze insoddisfatte, ne dovete aspettare che qualche anima pia, se c'è, crei i pacchetti per la vostra distribuzione e vi cavi d'impaccio.

Ma sopratutto, potete fare tutto senza andare a interferire con i file di sistema della vostra distribuzione che resta li intonsa e lontana dal pericolo di malfunzionamenti.

Nel prossimo post vedremo come usare pyenv per configurare una o più versioni di Python per poterle usarle nello sviluppo dei vostri programmi.

venerdì 29 novembre 2013

Installazione di Pyenv, il tool per la gestione di versioni multiple di Python

Dopo l'ampia presentazione di pyenv, il tool per installare e gestire in contemporanea più versioni di Python, vediamo ora come installarlo sulla vostra macchina di sviluppo.

Prima due piccole precisazioni:
  1. pyenv è basato su script Bash, per cui a differenza di tools simili, potete installarlo anche su macchine su cui Python non è presente. Indubbiamente un grande vantaggio;
  2. l'installazione non scarica i file originali dal sito ufficiale Python, bensì dal mirror dedicato di pyenv.
Detto questo, procediamo.

Aprite una shell (terminale) e installiamo le dipendenze per poter compilare correttamente i sorgenti di Python.

Per Ubuntu, Debian e distribuzioni derivate:

sudo apt-get install build-essential libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev git

Per Fedora e derivate:

date il comando su e inserite la password amministrativa quando richiesto, poi date il comando

yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel gdbm-devel ncurses-devel glibc-devel git

Bene, sistemate le dipendenze iniziamo l'installazione vera e propria che avverrà nella directory ~/.pyenv nella vostra home creata automaticamente dall'installazione.

Clonate il repository git di pyenv,

cd
git clone git://github.com/yyuu/pyenv.git .pyenv


e modificate alcune variabili d'ambiente per renderlo funzionante.

Solo per Ubuntu, Debian e derivate:

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc


e abilitate shims (spiegherò in un eventuale altro post di cosa si tratta) e  l'autocompletamento per pyenv:

echo 'eval "$(pyenv init -)"' >> ~/.bashrc

Per utenti di shell Zsh: nei precedenti comandi sostituite ~/.bashrc con ~/.zshenv

Per gli altri: nei precedenti comandi sostituite ~/.bashrc con ~/.bash_profile

Avete finito.

Per essere sicuri che tutte le modifiche siano state fatte correttamente, riavviate il sistema e nel terminale date il comando:

pyenv

Se la risposta che ottenete è qualcosa di simile a

pyenv 0.4.0-20131116-8-gbc2d245
Usage: pyenv <command> [<args>]

...

allora pyenv funziona.

Nel prossimo post vedremo come usarlo per installare una o più versione di Python sul nostro sistema.

lunedì 25 novembre 2013

Anteprima pyenv, il tool per installare e gestire più versioni di Python

Pyenv è un tool per l'installazione e la gestione di versioni multiple di Python su sistemi Unix/Linux e Mac OS X.

Grazie a pyenv potete installare tutte le versioni che volete di Python a partire dalla vecchissima 2.4, credo risalga al 2004, fino alla versione 3.4 ancora in fase di sviluppo nel momento in cui scrivo.

La facilità d'installazione è davvero disarmante: basta un comando con l'indicazione della versione di Python che volete sul vostro sistema, e a tutto il resto ci pensa pyenv.

Vi scarica il sorgente di Python, ve lo compila, e vi installa il tutto in un'apposita directory creata in automatico nella home dell'utente, così da non sporcare l'installazione di default di Python eventualmente già presente sul vostro sistema.

Ad esempio sulla mia Ubuntu 12.04 LTS ho già installati Python 2.7.3 e Python 3.2.3 direttamente dai repository della distribuzione. Grazie a pyenv ho installato anche la versione 2.7.6 e la 3.3.3 senza che esse interferiscano minimamente con le altre.

La comodità dell'installazione di Python con pyenv è eccezionale, ma il meglio deve ancora arrivare perché pyenv tira fuori il meglio di se quando lo usate per gestire quale versione o versioni, si, anche più d'una contemporaneamente, volete usare sul vostro sistema.

Ad esempio, potete sostituire l'uso della versione 2.7.3 con la 2.7.6 in tutto il sistema, oppure solo in una specifica directory: quando siete in questa directory, se avviate Python parte la versione 2.7.6 come qui sotto,

$ python
Python 2.7.6 (default, Nov 22 2013, 09:22:29)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.


ma appena uscite da questa directory riprende a funzionare la solita 2.7.3:

$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.


E se volete, potete arrivare ad una granularità così fine da configurare l'uso di una certa versione di Python solo all'interno della shell (terminale) corrente.

Ma non finisce qui, perché come vi dicevo, nulla vi vieta di configurare l'uso di più versioni di Python contemporaneamente, ad esempio la 2.6, 2.7 e la 3.3, così da poter ad esempio fare delle prove e assicurarvi che il vostro software sia compatibile con tutte e tre:

$ python2.6
Python 2.6.9 (unknown, Nov 22 2013, 22:52:18)
[GCC 4.6.3] on linux3
Type "help", "copyright", "credits" or "license" for more information.


$ python2.7
Python 2.7.6 (default, Nov 22 2013, 09:22:29)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.


$ python3.3
Python 3.3.3 (default, Nov 22 2013, 09:28:26)
[GCC 4.6.3] on linux
Type "help", "copyright", "credits" or "license" for more information.


Non vi ho ancora convinti della bontà di pyenv?

Allora sappiate che in ogni versione di Python che pyenv installa sul vostro sistema ci trovate anche pip, il gestore di pacchetti Python che dalla versione 3.4 è disponibile di default.

A questo punto anche l'installazione di ulteriori pacchetti Python, da Django passando per SciPy fino a PIL/Pillow e tutto il resto dell'immenso repository che è PyPI (Python Package Index) con i suoi 37036 pacchetti al momento in cui scrivo (e continua a crescere), diventa questione di un solo comando pyenv: poi come al solito ci pensa lui a tutto il resto.

Non vi ho ancora convinti a provare pyenv? Caspita quanto siete difficili! :-D
Allora è arrivato il momento di metter giù il carico da 90.

Che ne dite se con pyenv oltre a pip, il gestore di pacchetti Python, potete usare anche virtualenv, il tool per la creazione di ambienti virtuali Python? Non direttamente, per farlo bisogna prima installare un apposito plugin, pyenv-virtualenv, ma è questione di attimi ed una volta fatto gestire virtualenv diventa un gioco da ragazzi.

Grazie a virtualenv potete creare uno o più ambienti virtuali Python completamente isolati dal resto del sistema così da non interferire con esso. In ognuno di questi ambienti virtuali avrete una copia del Python di sistema su cui installare tutte le librerie che volete, e nella versione che più vi aggrada.

Per esempio, in un ambiente virtuale installate Django 1.5, in un altro la versione 1.6, e tutto questo senza che si crei il minimo conflitto tra di loro, ne con le librerie di sistema perché ognuna ha il suo ambiente virtuale completamente isolato da tutto il resto.

Il limite di questa soluzione è che comunque la vostra scelta della versione di Python disponibile nell'ambiente virtuale è limitata a quelle installate sul sistema. Ad esempio, sulla mia Ubuntu 12.04 sono le già citate versioni 2.7.3 e 3.2.3

Ma l'accoppiata pyenv + virtualenv gestito tramite il plugin pyenv-virtualenv è così potente che permette di superare questo limite: potete creare un ambiente virtuale scegliendo la versione di Python su cui costruirlo sia fra quelle di sistema, sia fra tutte quelle disponibili e installate in pyenv stesso, che lo ricordo vanno dalla 2.4 alla 3.4, e altre si aggiungeranno in futuro man mano saranno rese disponibili dalla comunità Python.

Per esempio, potreste costruire 3 ambienti virtuali completamente separati con:
  • Python 2.6 + Django 1.4;
  • Python 2.7 + Django 1.5;
  • Python 3.3 + Django 1.6;
Avete la totale libertà di scelta sia per quanto riguarda la versione Python da usare, sia per quanto riguarda le versioni delle varie librerie/moduli/framework che potete usare nel vostro lavoro: niente male, vero?

Un'ultima chicca: essendo basato su script Bash, pyenv non ha bisogno di Python per funzionare. Questo significa che potrete installarlo anche su macchine dove Python non è presente e godere lo stesso di tutti i vantaggi che abbiamo visto fin qui.

Su, ci dovremmo essere, dovreste ormai esservi convinti a provare pyenv.

Nella serie di post che seguiranno vedremo come installare e usare pyenv per renderci ancora più comoda e divertente la vita da programmatori Python.

sabato 23 novembre 2013

Sezione "Risorse Python" del blog: aggiornamento 4

Quarto aggiornamento per la sezione "Risorse Python" del blog. Ho aggiunto:
  • la nuova sezione "Environment Management" con la prima entry, pyenv;
  • la nuova sezione "Package Management" con la prima entry, pip.
Pyenv è un tool per la gestione di installazioni multiple di Python su sistemi Unix/Linux, Mac OS X.

Immaginate di voler installare sul vostro sistema diverse versioni di Python, ad esempio le versioni 2.6.9, 2.7.6 e 3.3.3 per essere sicuri che il vostro software non abbia problemi di compatibilità: ecco, pyenv fa al caso vostro.

Potrete scegliere quale versioni di Python usare, a partire dalla vetusta 2.4 fino alla 3.4 in questo momento ancora in fase di sviluppo. Potrete decidere se usare una certa versione a livello globale o solo per una specifica directory, o anche solo per il terminale che state usando in quel momento. Potrete impostare l'uso contemporaneo di più versioni di Python.

E se qualcuno dovesse chiedersi "ma non è quello che fa virtualenv?", la risposta è no, fanno cose diverse ma che si completano a vicenda.

Comunque di pyenv ne parlerò in una serie di prossimi post per cui sarà chiara la differenza.

Pip invece è un tool per l'installazione e gestione di pacchetti software Python in ambienti Unix/Linux, OS X, Windows.

Chi usa Python per lo sviluppo forse conosce e usa già EasyInstall a questo scopo, ma pip ha una marcia in più, e dalla versione 3.4 di Python è disponibile di default nell'installazione standard.

Se vi aggiungiamo il fatto che anche pyenv in ogni installazione Python che gestisce vi installa pip in modo predefinito, abbiamo due buoni motivi in più per dargli un'occhiata.

mercoledì 20 novembre 2013

Sezione "Risorse Python" del blog: aggiornamento 3

Terzo aggiornamento per la sezione "Risorse Python" del blog. Ho aggiunto:
  • il videocorso "Google's Python Class" di Google Developers per Python 2.x;
  • il corso universitario online del MIT OpenCourseWare tenuto da John Guttag, "6.00SC Introduction to Computer Science and Programming", sempre con Python 2.x.

martedì 19 novembre 2013

Rilasciata nuova release Python 3.3.3

Nuovo aggiornamento per il ramo 3.x: è stata rilasciata la versione 3.3.3 di Python con numerosi bugfix.

C'è anche da ricordare che questa versione rispetto alla precedente 3.2, apporta ulteriori miglioramenti al linguaggio che lo rendono una scelta sempre più interessante rispetto al precedente ramo 2.x.

Sezione "Risorse Python" del blog: aggiornamento 2

Secondo aggiornamento per la sezione "Risorse Python" del blog: ho aggiunto il videocorso di Marco Beri su Python 2.x.

sabato 16 novembre 2013

Pip disponibile di default a partire da Python 3.4

Per chi non lo conoscesse, pip è un tool per l'installazione e la gestione di pacchetti Python disponibile per sistemi operativi Unix/Linux, OS X, Windows, e versioni Python a partire da 2.6, passando per 2.7, 3.1, 3.2, fino all'ultima 3.3 e senza lasciare fuori PyPy.

È perfetto per evitare di doversi barcamenare con modalità diverse d'installazione a seconda del sistema operativo, e permette una gestione molto raffinata dei pacchetti.

La cosa non esaltante è che al momento va installato separatamente dopo l'installazione di Python sulla vostra macchina di sviluppo.

La buona notizia è che dalla versione 3.4 di Python pip sarà disponibile di default nell'installazione standard.

domenica 10 novembre 2013

Rilasciata nuova release Python 2.7.6

È stata rilasciata la versione 2.7.6 di Python.

Com'è noto non sono previste nuove feature, si tratta esclusivamente di bugfix che andranno avanti fino alla versione finale, la 2.7.9 prevista per Maggio 2015.

A quel punto lo sviluppo del ramo 2.x potrà dirsi definitivamente concluso e si continuerà sul solo ramo 3.x.

sabato 9 novembre 2013

Six: libreria per la compatibilita tra Python 2.x e Python 3.x

Uno dei dilemmi per chi inizia a studiare/usare Python è se concentrarsi su Python 2 oppure il più recente Python 3. Spesso la scelta è a favore del primo perché, fra gli altri motivi, alcune librerie/framework non supportano ancora Python 3.

Con la libreria di compatibilità Six, il cui nome deriva da 2 * 3 = 6, il prodotto dei numeri delle versione di Python coinvolte, è stato creato un wrapper che nascondendo le differenze permette a molte di queste librerie/framework di funzionare con entrambi le versioni di Python.

Tanto per dire, Django dalla versione 1.5 usa proprio Six per garantirsi la compatibilità sia con Python 2 (≥ 2.6.5) che con Python 3 (≥ 3.2).

La storia di Python raccontata dal suo creatore

Guido van Rossum che racconta la storia della sua creatura.

Buona visione.

Aggiornata la sezione Risorse Python del blog

Ho aggiornato la pagina delle "Risorse Python" di questo blog, ora contiene tutto il materiale indispensabile per iniziare nel modo migliore a studiare Python.

Ho suddiviso il tutto in 4 sezione a seconda sia delle competenze informatiche che linguistiche:
  • Libri Italiano - da zero
  • Libri Italiano - da altri linguaggi
  • Libri Inglese - da zero
  • Libri Inglese - da altri linguaggi
Tenete presente che molti dei libri indicati sono liberamente scaricabili.

Se trovate link non funzionanti, errori, omissioni, o volete segnalare risorse che a vostro avviso sono interessanti, usate i commenti che trovate alla fine di quella pagina.

venerdì 1 novembre 2013

Il miglior libro per imparare Python

È una domanda che in varie forme è stata spesso posta sul forum italiano di Python.
La risposta breve è: non esiste.

Molto dipende dalle conoscenze pregresse del lettore, sia informatiche che linguistiche.
Essenzialmente abbiamo:
  • programmatore alle prime armi;
  • programmatore proveniente da altri linguaggi;
  • legge solo in italiano;
  • legge anche in inglese.
Tenendo presente questo, il mio personale punto di vista su quale sia il miglior libro per imparare Python. Lo terrò aggiornato man mano ci saranno nuove pubblicazioni e me ne sarò fatto un'idea.

Quegli stessi libri e molto altro ancora, per esempio tutorial, video, anche interi corsi universitari in Python, li trovate nella sezione "Risorse Python" del blog.

venerdì 1 marzo 2013

Formattazione di stringhe tramite l'operatore % - 2a parte

I segnaposto %s e %d, rispettivamente stringa e numero, visti nel post precedente parlando di espressioni di formattazione di stringa, non sono gli unici possibili: esistono molti altri di quelli che in realtà si chiamano codici di formattazione. Vediamo come usarli con qualche altro esempio.

Stampiamo il valore di pigreco in tre modi diversi. Così come disponibile in Python attraverso il suo modulo math:

>>> import math
>>> print(math.pi)
3.141592653589793

Con 2 cifre di precisione e zero colonne di ampiezza che sta per "nessun incolonnamento", quindi nessuna giustificazione:

>>> print("%0.2f" % math.pi)
3.14

Con 4 cifre di precisione e zero colonne di ampiezza. Notare l'arrotondamento del valore di pigreco, 3.14159 arrotondato a 3.1416:

>>> print("%0.4f" % math.pi)
3.1416

Finora si è parlato sempre di giustificazione a destra, ma è possibile giustificare le stringhe anche a sinistra. Riprendiamo un esempio già visto ma modificato in tal senso:

"""Stampa 3 variabile: un numero, il numero elevato al quadrato ed elevato 
alla quinta, ognuna come stringa ampia 6 colonne giustificata a sinistra.
"""
for x in range(1,10):
    y = x ** 2
    z = x ** 5
    print("%-6s%-6s%-6s" % (x,y,z))

1     1     1     
2     4     32    
3     9     243   
4     16    1024  
5     25    3125  
6     36    7776  
7     49    16807 
8     64    32768 
9     81    59049

Altro esempio:

# Formattazione di stringa ampia 9 colonne, con e senza zeri di riempimento.
x = 98765
stringa = "Zeri di riempimento, %09d; senza zeri di riempimento, %9d." % (x, x)
print(stringa)

Zeri di riempimento, 000098765; senza zeri di riempimento,     98765.

Notate come il numero più a destra qui sopra sia molto spostato a destra rispetto alla virgola. È dovuto al fatto che è rappresentato da un numero ampio comunque 9 colonne come quello che lo precede, ma non ha gli zeri di riempimento.

Un esempio di notazione scientifica:

# Formattazione di stringa ampia 9 colonne, con e senza zeri di riempimento.
x = 98765
print("%010.4e." % x)

9.8765e+04.

Un ultimo esempio che vediamo è quello in cui non sappiamo esattamente quante colonne deve essere ampio numero, ne il numero di cifre significative che servono. In questo caso possiamo usare delle variabili ulteriori per specificarlo come in questo esempio:

import math

x = math.pi
larghezza = 8
precisione = 5
stringa = "%08.5f, %0*.*f" % (x, larghezza, precisione, x)
print(stringa)

03.14159, 03.14159

Potete notare come il secondo pigreco è formattato esattamente come il primo.

Il risultato è stato ottenuto inserendo degli asterischi al posto dei valori sconosciuti (larghezza in colonne del numero e precisione richiesta) nella stringa di formattazione a sinistra di %, alla sua destra invece, nelle parentesi tonde, sono state inseriti delle variabili nello stesso ordine delle informazioni mancanti.

Questo è solo un primo approccio alla formattazione di stringhe in Python tramite l'operatore %. Giocateci un po' a casa così da dissipare sul campo eventuali dubbi, e sperimentate ulteriori codici di formattazione di stringe fra quelli disponibili.

giovedì 28 febbraio 2013

Inserire codice Python nei post di Blogger

Cercavo un modo semplice per inserire codice Python (e non solo) all'interno dei post di Blogger.

Mi serviva un qualcosa che lo formattasse correttamente in pochi semplici passi, magari dotato di syntax highlighting, e che possibilmente non si appoggiasse a qualche script lato utente che lo avrebbe reso inutile per quanti viaggiano in rete con Javascript disabilitato nel browser.

È così che mi sono imbattuto in hilite.me.

Basta copiare il codice nell'apposito box, selezionare il linguaggio (Python e svariate altre decine a scelta), lo stile da usare, se visualizzare o meno i numeri di riga a lato del codice, e infine un click: compare sia la preview che mostra come quel codice sarà visualizzato nel post, sia il codice in puro HTML da incollare nell'editor di Blogger aperto in modalità HTML.

Un esempio dei risultati vale più di mille parole:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
""" Calcolo della radice quadrata con il metodo iterativo di Newton.
"""
import math

x = int(input("Inserisci il numero di cui calcolare la radice quadrata: "))
tolleranza = float(input("Inserisci la tolleranza desiderata (es. 0.0001): "))
z = 1.0
count = 0

while True:
    count += 1
    z = (z + (x / z)) / 2  # nuova e migliore approssimazione della radice quadrata.
    differenza = abs(x - z**2)  # calcola quanto dista l'approssimazione dalla radice reale.
    if differenza < tolleranza:
        break

print("Il valore calcolato con il metodo di Newton e':", z, "calcolato in", count, "iterazioni.")
print("Il valore calcolato con la funzione sqrt() di Python e'", math.sqrt(x))

Per quanti conoscono Python ed i suoi framework, il sito si appoggia a Flask come web framework e Pygments come syntax highlighter. Volendo vi è anche un'API da richiamare per avere in risposta del codice pronto in HTML in formato UTF-8.

venerdì 22 febbraio 2013

Formattazione di stringhe tramite l'operatore %

Python possiede numerosi strumenti per la formattazione delle stringhe. Quelli classici sono la concatenazione e le operazioni sulle sequenze come il sezionamento. Per esempio (in Python 3.x, per Python 2.x ricordatevi non servono le parenti per print):

concatenazione di stringhe

>>> concatenazione = "Stringa" + "intera"
>>> print(concatenazione)
Stringaintera

sezionamento di stringhe

>>> print(concatenazione[0:6])
String

Molto più sofisticate sono le "espressioni di formattazione di stringa". Qualche esempio per capire cosa sono e come funzionano:

>>> nome = "Pippo"
>>> eta = 50
>>> print("Ti chiami %s." % nome)
Ti chiami Pippo.

In pratica % fa da segnaposto all'interno della stringa fra i doppi apici: quando print viene eseguita il segnaposto viene sostituito con quanto disponibile nella variabile nome ed il tutto viene stampato. I segnaposto possono essere anche più di uno, così:

>>> print("Ti chiami %s e hai %d anni." % (nome, eta))
Ti chiami Pippo e hai 50 anni.

Da notare come i due segnaposto sono diversi:
  • il primo, %s, ha una s che sta per string (stringa) e indica che in quella posizione dovrà esserci una stringa di testo;
  • il secondo, %d, ha una d che sta per digit (numero) e indica che in quella posizione dovrà esserci un numero.
Inoltre quando le variabili a destra di % sono più d'una, vanno tra parentesi tonde.

Vediamo qualche altro esempio. Immaginiamo di voler visualizzare un numero da 1 a 9, e a fianco quel numero elevato sia al quadrato che al cubo:

1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729

Per generare questo assortimento male allineato di numeri bastano poche righe:

1
2
3
4
for x in range(1, 10):
    quadrato = x ** 2
    cubo = x ** 3
    print(x, quadrato , cubo)

Allineiamo le cifre tutte a destra usando un'espressione di formattazione di stringa:

1
2
3
4
for x in range(1,10):
    quadrato = x ** 2
    cubo = x ** 3
    print("numero:%4d%4d%4d" % (x, quadrato , cubo))

Il risultato:

   1   1   1
   2   4   8
   3   9  27
   4  16  64
   5  25 125
   6  36 216
   7  49 343
   8  64 512
   9  81 729

Da notare che %d ora è diventato %4d, dove il 4 sta a significare che ogni cifra deve essere formattata come se fosse ampia 4 colonne anche quando il numero è più piccolo.

Fate attenzione invece al caso in cui il numero o più in generale la stringa da formattare è più grande delle colonne da noi stabilite: in questo caso Python non applica nessuna formattazione.

Nel prossimo post vedremo ulteriori utilizzi dell'operatore % di formattazione delle stringhe.