Fer executables directes

En UNIX, un fitxer text pot ser executable fent el següent:

  • Escrivint en la primera línia del text, l’intèrpret que executarà el text. Aquesta línia contindrà a l’inici els caràcters #! per després posar el camí i el nom de l’executable que interpretarà el text. Per exemple, els guions de bash començaran:

    #!/bin/bash
    
  • Canviar els indicadors del fitxer posant que sigui executable per tothom:

    $ chmod +x fitxerExecutable
    
  • O bé, que sigui executable només pel usuari:

    $ chmod u+x fitxerExecutable
    
  • La mateixa idea es podria fer per donar permisos de grup (g) o tothom (a)

Per fer un executable de python 3 cal posar en el fitxer de python la primera línia:

#!/usr/bin/python3

Això funciona per debian i ubuntu. No tots els sistemes UNIX posen l´interpret python a /usr/bin/. Per fer compatible el guió en altres sistemes que usen altres camins, s’usa el programa /usr/bin/env que rep com a paràmetre l’intèrpret a executar. Si aquest és python3 la línia quedaria:

#!/usr/bin/env python3

Exemple:

  • Editem el fitxer exemple.py:

    #!/usr/bin/env python3
    print('Hola tothom')
    
  • Escrivim en el terminal:

    $ chmod +x exemple.py
    
  • Ara el podem executar directament:

    $ ./exemple.py
    Hola tothom
    $
    
  • Si escrivim:

    $ export PATH=$PATH":."
    
  • bash cercarà també l’executable al directori de treball (».»):

    $ exemple.py
    Hola tothom
    $
    

Per treballar des del interpret de python i/o des del interpret de bash, el millor és organitzar el codi de python de la següent manera:

  • Editem el fitxer exemple.py:

def programa():
    print('Hola tothom')

if __name__ == "__main__":
    programa()
  • Editem el fitxer exemple amb indicadors x:

#!/usr/bin/env python3
from exemple import programa

if __name__ == "__main__":
    programa()
  • D’aquesta forma, podem fer en bash (si el PATH té en compte el directori de treball):

    $ exemple
    Hola tothom
    $
    
  • També:

    $ python3
    >>> from exemple import programa
    >>> programa()
    Hola tothom
    
  • Si no haguéssim posat la construcció if en exemple.py, un import en l’interpret de python executaria el programa en el moment de fer l’import.