lunedì 15 luglio 2013

Mission Python - OPS! cont?

L'amico Bit3Lux, titolare del blog mi fa notare che non rispondo ai commenti dei nostri lettori. Ha ragione, colpa mia, tutta.

Anche se a dire il vero volendo potrei tirare in ballo diverse concause:
  • una congiunzione astrale sfavorevole, per di più in concomitanza con un attacco woodoo;
  • dimenticato di rifare l'RSS ai commenti, colpa di Google che ha chiuso G-Reader;
  • troppe cose da fare, la memoria non è più quella di una volta e fa caldo.
OK, sono scuse, mica pensate che possa dire una cosa così.
Anzi rilancio: visto che il corso è seguito (si vede anche dal numero delle visite) si può continuare. Io ne sarei felice.

Facciamo che commentate chiedendo quali argomenti volete siano trattati e, nel limite del possibile e tenendo conto non solo delle mie capacità ma anche delle condizioni astrali, sarete accontentati. Forse.

Per intanto, per dimostrarvi la mia buona fede e volontà rispondo a un paio di domande inevase.

Python e l'Unicode.
È importante inserire il metacommento # -*- coding: UTF-8 -*- che consente per Python 2 (che continua a essere di gran lunga il più usato) di visualizzare correttamente i caratteri non 'mericani come le lettere accentate. Naturalmente questo non succede nella versione interattiva e in Idle. Ma se provate con print vedete che funziona.
Il metacommento deve essere la prima o la seconda riga dello script, e cominciare in prima colonna, niente spazi iniziali.
Per chi usa Linux, Mac e Unix (c'è ancora qualcuno? se me lo dice vengo a trovarlo, con un regalo) la prima riga dovrebbe essere la shebang: #!/usr/bin/python che verrà spiegata immediatamente rispondendo alla seconda domanda.

Cos'è chmod?
Per Linux, e suo papà Unix, è possibile rendere qualsiasi script eseguibile, come se fosse un .bat di Windows. Per fare questo sono necessarie 2 condizioni:
  • la prima riga dev'essere la shebang, per Python è (molto probabilmente questa): #!/usr/bin/python
  • lo script dev'essere reso eseguibile, con il comando chmod.
Il comando chmod è più ricco di quello che usiamo di solito come potete verificare con man chmod nel terminale. Di solito si una la scorciatoia chmod +x nome-dello-script.
Per scrivere la shebang, cioè per sapere dove si trova l'interprete  che eseguirà lo script esiste il comando whereis:


Intanto ho chiesto per Ruby perché con Python verrebbe troppo lungo (ho diverse versioni e estensioni installate, situazione complicata si direbbe su Facebook). Come vedete dallo screenshot la prima path è /usr/bin/ruby che è quella buona.
Esiste anche un'alternativa, più portabile (chi ha detto BSD?): non cercare l'eseguibile con whereis ma usare env. In questo caso la shebang diventa #!/usr/bin/env python che funziona anche con Linux, anzi probabilmente l'ho usata anche negli esempi riportati.

Tutto questo naturalmente non vale per Windows. In questo caso conviene creare un file .bat con il solito editor di testo (Ntepad o un'alternativa migliore). Il file è sufficiente che contenga una sola riga; supponendo che lo script da eseguire si chiami esempio.py la riga in questione sarà: @python esempio.py %*

Compilando questo post mi sono accorto che con Windows ci sono effettivamente dei piccoli problemi, preso un post tutto per l'Unicode.

Intanto ecco il file esempio.py che ho usato e i due screenshot del terminale di Windows (chiamato Prompt dei comandi):

Esecuzione invocando Python

 

Esecuzione con il file esempio.bat


Questo è il file esempio.py


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# -*- coding: UTF-8 -*-

import sys

st = u"Ecco questo è l'esempio!"
print st
num_args = len(sys.argv)
for c in range(num_args):
 print c, sys.argv[c]
print "*"

Inoltre: sì se uno fa doppio click sul nome del file Python dentro Explorer (Esplora risorse) lo script viene eseguito di nascosto, prossimamente un post anche su questo.

3 commenti:

  1. Prova per vedere se funziona l'iscrizione ai commenti

    RispondiElimina
  2. Per essere una semplice prova, direi che è ampiamente superata..
    E Bit3lux sarà soddisfatto... ;)

    RispondiElimina
    Risposte
    1. :-)
      prossimamente... sto preparando un post.

      Elimina