¿Cómo Ejecutar Scripts Python?

¿Qué es un Script o Guión?

Antes de ir al tema que nos ocupa, vamos a definir de alguna manera qué es un “script”. Script es una palabra inglesa que significa guión, manuscrito, y que es comúnmente utilizado en el ámbito del cine, el teatro, la televisión, etc. para identificar la descripción escrita de una película, serie o programa televisivo. En el ámbito de la informática se emplea el término script para designar un archivo que contiene una secuencia lógica de órdenes o un archivo de procesamiento por lotes. Se trata de un programa usualmente simple, que por lo regular se almacena en un fichero de texto plano. Los scripts son siempre interpretados por algún intérprete, pero no todos los programas interpretados son scripts. La frontera real entre script y programa o aplicación es bien difusa, existen ejemplos de aplicaciones bien complejas escritas usando lenguajes clasificados como de scripting. Un ejemplo clásico de lenguaje de scripting es el lenguaje Bash disponible en la mayoría de las distribuciones GNU/Linux.

Python es clasificado por muchos como un lenguaje de scripting, y a los programas escritos en Python, se les suele llamar scripts. Los scritps de Python, pueden ser ejecutado por varias vías: desde la consola o terminal, desde una sección interactiva, de forma directa en sistemas Unix, etc. Veamos los detalles de cada una de estas opciones y de algunas otras.

¿Es Python un Lenguaje de Scripting?

Habitualmente los scripts se emplean para diversas tareas como combinar componentes, interactuar con el sistema operativo o con el usuario y automatizar tareas repetitivas de administración, entre otras. Como Python es un lenguaje interpretado, que además sirve para todo lo anterior, suele llamarse script a los programas escritos en Python, y por tanto, es común que se diga que Python es un lenguaje de scripting. Dicho esto, debo aclarar que personalmente no comparto este criterio, sino que vemos a Python como un lenguaje de programación de propósito general que con frecuencia se usa para crear scripts.

Corre, Corre Python

A pesar que que empleando una sección interactiva en el intérprete de Python podemos hacer muchísimas cosas y escribir infinidad de líneas de código, una vez que cerremos la sección interactiva perderemos todo lo que hemos escrito. Es por esto que la forma habitual de escribir código Python es en archivos de texto plano con extensión .py. El uso de la extensión .py es una convención generalmente empleada para identificar los archivos que contienen código Python. Aclaro que en sistemas Windows la extensión puede ser .pyw. Este esquema de nombrado, técnicamente hablando, no es imprescindible, pero por cuestión de consistencia recomendamos que siempre se emplee esta convención. Yendo al grano, existen varias maneras de correr o ejecutar un script de Python contenido en un archivo de texto con extensión .py. Comencemos con un nuestro “Hola Mundo!” inprescindible, para lo cual creamos un archivo de texto plano con nuestro editor favorito y ponemos en él el código siguiente:

#!/usr/bin/env python print('Hola Mundo!')

Luego guardamos el archivo en un directorio de trabajo en nuestro ordenador y le asignamos el nombre hola.py. Con estos pasos ejecutados veamos cómo podemos correr este archivo que sería nuestro script de prueba.

Ejecución Desde la Consola o Terminal

La primera forma o método de ejecución que vamos a ver, consiste en abrirnos una consola o terminal del sistema y ejecutar el comando python o python3 (según sea la versión que tengamos instalada), proveyendo el camino al archivo fuente como parámetro:

$ python hola.py

Inmediatamente veremos en nuestra pantalla la frase: “Hola Mundo!” y ya está, ejecutamos el script. Esta es la forma básica y la que más se emplea en la práctica, a no ser que utilices un IDE (Integrated Development Environment por sus siglas en ingles) o un editor de texto avanzado para escribir tus scripts.

Ejecución desde una Sección Interactiva

También podemos ejecutar un script desde una sección interactiva del Intérprete Python usando la instrucción import, aunque esto no es muy común, pues son los módulos y no lo scripts, los que están pensados para ser importados, es decir, los scripts están diseñados para ser ejecutados directamente y los módulos para ser importados. Desde el Interprete introduzcamos el código siguiente:

>>> import hola Hola Mundo!

y… si somos afortunados veremos en pantalla la frase ya descrita. Digo “si somos afortunados” porque para que esto ocurra deben cumplirse algunas condiciones. Primero que todo, el archivo que contiene el código Python debe estar ubicado en el directorio desde donde estamos ejecutando el interprete o estar en el “Python module search path”, es decir, el camino donde Python busca sus librerías o bibliotecas. En segundo lugar, esto sucederá una única vez, pues cada archivo o módulo se importa, y por tanto se ejecuta, una única vez, a menos que usemos la función imp.reload(). Esto significa que si ejecutamos import hola nuevamente, no obtendremos ninguna salida en pantalla, pues el módulo hola.py ya ha sido importado anteriormente.

Usando la Función imp.reload()

Una vez que hemos importado por primera vez un módulo determinado, podemos usar la función reload() del módulo imp de la librería estándar, para re-importar el módulo en cuestión. Esto es útil cuando estamos modificando un módulo y queremos probar el funcionamiento de los nuevos cambios sin abandonar la sección interactiva actual.

>>> import hola Hola Mundo! >>> import imp >>> imp.reload(hola) Hola Mundo! <module 'hola' from '/home/username/hola.py'>

Como podemos apreciar en este caso, cuando llamamos la función imp.reload() pasándole el nombre del modulo como parámetro, se vuelve a imprimir en pantalla la cadena “Hola Mundo!”, lo que significa que se ha ejecutado nuevamente el módulo. Debemos decir que en la rama 2.x de Python la función reload() está incluida en el lenguaje y también en el módulo imp de la librería estándar. En este caso podemos ejecutar lo siguiente desde el intérprete:

Python 2.7.12 (default, Nov 19 2016, 06:48:10) [GCC 5.4.0 20160609] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import hola Hola Mundo! >>> reload(hola) Hola Mundo! <module 'hola' from 'hola.pyc'>

Ejecución Directa en Sistemas Unix

El tercer método que veremos está relacionado con los sistemas operativos Unix-like como es el caso de GNU/Linux. Si se repasamos un poco en el contenido del archivo hola.py, nos daremos cuenta de que comienza con una línea bien interesante, se trata de una línea comentada que tiene un significado especial para los sistemas Unix-like: #!/usr/bin/env python. En los sistemas Unix-like este tipo de línea “informa” al sistema operativo sobre programa que se encargará de interpretar o ejecutar el código que contiene el archivo, por tanto, para ejecutar un script con estas características solo tenemos que asignarle permisos de ejecución y ejecutarlo con doble clic o presionando la tecla “Enter” sobre él, tal y como haríamos con cualquier otro programa ejecutable en el sistema.

Ejecución desde un IDE o un Editor de Texto Avanzado

La cuarta variante que podemos emplear para ejecutar nuestros scripts es usar un IDE (Integrated Development Environment por sus siglas en inglés) o un editor de texto avanzado, que permita ejecutar el script desde el propio IDE o editor. Existe una amplia variedad de estos programas a nuestra disposición, muchos de ellos disponibles en los repositorios de la principales distribuciones de GNU/Linux y otros que se pueden descargar directamente desde Internet. Para comenzar, un Editor bien sencillo y ligero que podemos usar es Geany, el cual nos permite correr el script en que estamos trabajando con solo presionar la tecla F5. Editores como Sublime Text, Visual Studio Code, Vim, entre otros, también permiten la ejecución de scripts. El IDE por defecto incluido en cualquier instalación estándar de Python es IDLE y lo podemos emplear para escribir, ejecutar, depurar y modificar nuestro scripts. Otros IDEs como Eclipse-PyDev, PyCharm, Eric, permiten igualmente la ejecución de script Python desde el propio entorno.

Para los que Prefieren Python 2.x

Para aquellos que prefieren usar la rama 2.x de Python, existe la función denominada execfile() que es capás de ejecutar archivos de código Python. La función execfile() recibe como argumento el camino hasta el archivo que contiene el código Python.

Python 2.7.12 (default, Nov 19 2016, 06:48:10) [GCC 5.4.0 20160609] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> execfile('hola.py') Hola Mundo!

El Último Intento… Usando exec()

Hasta ahora hemos visto las vías comúnmente empleadas para correr un script de Python. Veamos entonces una vía alternativa que nos ilustra la potencia de Python como lenguaje. Abrimos una sección interactiva tecleamos lo siguiente:

Python 3.5.2 (default, Nov 17 2016, 17:05:23) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> exec('\n'.join(open('hola.py').readlines())) 'Hola Mundo!'

Esta sentencia abre el archivo hola.py, lee su contenido y se lo pasa como argumento en forma de string a la función exec(), que finalmente ejecuta el código contenido en el script. Este ejemplo es bastante extravagante y realmente no creo que lo empleemos en la práctica. Tiene además el inconveniente de que no cierra correctamente el archivo al terminar de usarlo, lo que puede acarrear resultados inesperados. Se trata de un “Hack” que muestra cuán versátil y flexible puede se Python si dominamos las interioridades de su funcionamiento.

Lecturas Recomendadas

Para profundizar en los métodos disponibles para ejecutar scripts de Python, recomendamos la lectura del Capítulo II “How Python Runs Programs” del libro “Learning Python” de Mark Lutz, publicado por la Editorial O’Reilly.

2 comentarios

    • barlows en 3 octubre, 2017 a las 8:13 pm

    Hola, ante todo enhorabuena por el blog espero que no lo dejes caer como ha pasado con muchas iniciativas. Bueno al grano. Recien estoy estudiando python y he decidido migrar algunos de mis proyectos pero me he topado con un problemita en cuanto a los paquetes. Resulta que tengo esta estructura
    [code]
    ProjectA/
    packa/
    tests/
    __init__.py
    app_tests.py
    __init__.py
    app.py
    [/code]
    cuando trato de importar app.py en el modulo tests.app_tests me da un error de importacion pues me dice que no reconoce algun modulo con el nombre app pero cuando hago la importacion a la inversa si que puedo acceder a tests.app_tests
    que puedo hacer para acceder a los modulos desde cualquier posicion dentro del proyecto. Ya he tratado con PYTHONPATH pero nada.

    disculpa el offtopic peor no tienes donde poner preguntas o sugerencias de forma general

    1. En realidad no tengo muy clara la estructura de directorios que tienes, de todos modos Python busca los módulos que importamos a través del listado de directorios almacenados en sys.path, sys.path se nutre del directorio de trabajo actual, luego PYTHONPATH y los paths que dependen de la instalación estándar de Python en tu Ordenador. Puedes leer más sobre sys.path en la Documentación de Python: 2.x o 3.x
      Si abres una terminal y ejecutas python o python3 y luego introduces:
      >>> import sys
      >>> sys.path
      verás como tienes tu sistema configurado.
      Evidentemente el error te lo está dando porque estás tratando de importar un módulo que no está en tu sys.path, el intérprete no lo encuentra y por tanto da un error.
      Está claro que si tu directorio de trabajo es test, el intérprete busca en el propio directorio y no encuenta el módulo app, luego en el sys.path y tampoco lo encuentra. Si lo haces a la inversa resulta que test es un subdirectorio del directorio donde está app.py y efectivamente puedes importar el módulo app_tests.
      Creo que tu solución puede ser incluir el directorio raíz de tu proyecto en tu PYTHONPATH, es decir, en este caso creo que es ProjectA.
      saludos,
      lpozo

Los comentarios han sido desactivados.