16. Apéndice
************


16.1. Modo interactivo
======================


16.1.1. Manejo de errores
-------------------------

Cuando ocurre un error, el intérprete imprime un mensaje de error y la
traza del error.  En el modo interactivo, luego retorna al prompt
primario; cuando la entrada viene de un archivo, el programa termina
con código de salida distinto a cero luego de imprimir la traza del
error. (Las excepciones manejadas por una clausula "except" en una
sentencia "try" no son errores en este contexto).  Algunos errores son
incondicionalmente fatales y causan una terminación con código de
salida distinto de cero; esto se debe a inconsistencias internas o a
que el intérprete se queda sin memoria. Todos los mensajes de error se
escriben en el flujo de errores estándar; las salidas normales de
comandos ejecutados se escriben en la salida estándar.

Al ingresar el caracter de interrupción (por lo general "Control-C" o
"Supr") en el prompt primario o secundario, se cancela la entrada y
retorna al prompt primario.  [1] Tipear una interrupción mientras un
comando se están ejecutando lanza la excepción "KeyboardInterrupt",
que puede ser manejada con una sentencia "try".


16.1.2. Programas ejecutables de Python
---------------------------------------

En los sistemas Unix y tipo BSD, los programas Python pueden
convertirse directamente en ejecutables, como programas del intérprete
de comandos, poniendo la linea:

   #!/usr/bin/env python3.5

...al principio del script y dándole al archivo permisos de ejecución
(asumiendo que el intérprete están en la variable de entorno "PATH"
del usuario).  "#!" deben ser los primeros dos caracteres del archivo.
En algunas plataformas, la primera línea debe terminar al estilo Unix
("'\n'"), no como en Windows ("'\r\n'").  Notá que el caracter numeral
"'#'" se usa en Python para comenzar un comentario.

Se le puede dar permisos de ejecución al script usando el comando
**chmod**:

   $ chmod +x myscript.py

En sistemas Windows, no existe la noción de "modo ejecutable".  El
instalador de Python asocia automáticamente la extensión ".py" con
"python.exe" para que al hacerle doble click a un archivo Python se
corra el script.  La extensión también puede ser ".pyw", en este caso
se omite la ventana con la consola que normalmente aparece.


16.1.3. El archivo de inicio interactivo
----------------------------------------

Cuando usás Python en forma interactiva, suele ser útil que algunos
comandos estándar se ejecuten cada vez que el intérprete se inicia.
Podés hacer esto configurando la variable de entorno "PYTHONSTARTUP"
con el nombre de un archivo que contenga tus comandos de inicio.  Esto
es similar al archivo ".profile" en los intérpretes de comandos de
Unix.

Este archivo es solo leído en las sesiones interactivas del
intérprete, no cuando Python lee comandos de un script ni cuando
"/dev/tty" se explicita como una fuente de comandos (que de otro modo
se comporta como una sesión interactiva).  Se ejecuta en el mismo
espacio de nombres en el que los comandos interactivos se ejecutan,
entonces los objetos que define o importa pueden ser usados sin
cualificaciones en la sesión interactiva.  En este archivo también
podés cambiar los prompts "sys.ps1" y "sys.ps2".

Si querés leer un archivo de inicio adicional desde el directorio
actual, podés programarlo en el archivo de inicio global usando algo
como "if os.path.isfile('.pythonrc.py'):
exec(open('.pythonrc.py').read())".  Si querés usar el archivo de
inicio en un script, tenés que hacer lo siguiente de forma explícita
en el script:

   import os
   filename = os.environ.get('PYTHONSTARTUP')
   if filename and os.path.isfile(filename):
       with open(filename) as fobj:
           startup_file = fobj.read()
       exec(startup_file)


16.1.4. Los módulos de customización
------------------------------------

Python provee dos formas para customizarlo: "sitecustomize" y
"usercustomize".  Para ver como funciona, necesitás primero encontrar
dónde está tu directorio para tu usuario de paquetes del sistema.
Arrancá Python y ejecutá el siguiente código:

   >>> import site
   >>> site.getusersitepackages()
   '/home/user/.local/lib/python3.5/site-packages'

Ahora podés crear un archivo llamado "usercustomize.py" en ese
directorio y poner lo que quieras en él.  Eso afectará cada ejecución
de Python, a menos que se arranque con la opción "-s" para
deshabilitar esta importación automática.

"sitecustomize" funciona de la misma manera, pero normalmente lo crea
el administrador de la computadora en el directorio global de paquetes
para el sistema, y se importa antes que "usercustomize". Para más
detalles, mirá la documentación del módulo "site".

-[ Footnotes ]-

[1] A problem with the GNU Readline package may prevent this.
