Cómo automatizar un script de Python en Windows y Mac

Automatizar nuestros scripts de Python es vital para poder sacarles el máximo provecho. Para cosas complejas, siempre recomendaría automatizar los scripts en la nube, tal como vimos en en este post sobre cómo automatizar script de Python en Google Cloud.

Sin embargo, muchas veces no necesitamos que la automatización sea perfecta. En esos casos basta con automatizar nuestros scripts de Python en local. Es por ello que hoy vamos a aprender cómo automatizar nuestros scripts de Python en local, en Windows y Mac. ¡Vamos a ello!

Requisitos para automatizar un script de Python en Windos y Mac

Lo primero de todo que vamos a e necesitar para automatizar nuestro script de Python (ya sea en Windows o Mac) es tener un script de Python que sea autónomo al 100%. Es decir, que si ejecutamos el script de principio a fin (1) no va a devolver errores o los podrá manejar y (2) generará el resultado que nos interesa.

En mi caso a modo de ejemplo automatizaré un script muy sencillito para un proceso ETL. Básicamente el script (1) extrae los datos de posición de los aviones en circulación de una API y (2) sube esos datos a una base de datos que he montado en Heroku. Este suele ser un caso típico cuando el acceso a la API es limitada y queremos tener acceso a nuestros datos históricos, por ejemplo.

El script de Python que vamos a automatizar tanto en Windows como en Mac es el siguiente:

import requests
import pandas as pd
from sqlalchemy import create_engine


url = "https://opensky-network.org/api/states/all"
response = requests.get(url)
data = response.json()
df = pd.DataFrame(data['states'])

columns = [
    'icao24','callsign','origin_country','time_position','last_contact',
    'longitude','latitude','baro_altitude','on_ground','velocity','true_track',
    'vertical_rate','sensors','geo_altitude','squawk','spi','position_source'
]
df.columns = columns

# Nos quedamos solo con 20 filas para no sobrepasar el limite gratuito de la bbdd
df = df.iloc[0:20,:]

host = 'XXX-XX-XXX-XXX-XXX.eu-west-1.compute.amazonaws.com'
db = "XXXXXXXXXXXXXX"
user = "XXXXXXXXXXXXXX"
pasw = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

engine = create_engine('postgres://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
df.to_sql('flights', engine,if_exists='append')

Como vemos, este script es autoejecutable. Sin embargo, al tratarse de una automatización en local hay que tener en cuenta que puede que algún día nuestra automatización falle. Por ello, creo que es buena práctica que nuestro código sea resiliente a fallos. En este caso lo conseguiríamos:

  1. Leyendo la última fecha de datos que hay en la base de datos.
  2. Haciendo la extracción de datos de la API desde esa fecha hasta la fecha actual.

Con estos dos pequeños cambios, conseguiríamos que nuestro código fuese mucho mejor y tuviéramos muchos menos problemas una vez se automatiza. En cualquier caso, como ejemplo nos sirve. Así pues, una vez tenemos nuestro código y cumple con los requisitos para automatizarlo, ¡veamos cómo automatizar nuestro script de Python en Windows y Mac!

Automatizar script de Python en Windows

Para automatizar un script de Python en Windows, tenemos que seguir dos pasos:

  1. Crear un fichero bat que ejecute nuestro fichero en Python
  2. Automatizar la ejecución de nuestro fichero bat con Task Scheduler.

Crear un fichero bat que ejecute nuestro fichero en Python

Un fichero bat es un tipo de fichero DOS que sirve para ejecutar líneas de comando en la consola de Windows (Windows Prompt). Para crear este fichero simplemente vamos a tener que crear un archivo de texto con la siguiente estructura:

<ruta al fichero Python.exe> <ruta al fichero de Python a automatizar>

Si no sabes en qué carpeta tienes Python, puedes comprobarlo con el siguiente código:

import sys
print(sys.executable)
C:\Users\Ander\anaconda3\python.exe

Una recomendación personal es que guardes todos los scripts que quieras automatizar en una carpeta que no vayas a mover. Sino, podría darse el caso de que cambies el nombre de la carpeta o la cambies de lugar haciendo que se rompa la automatización.

En mi caso, la carpeta el script a automatizar lo he guardado en una carpeta llamada “Auomations” dentro de los documents. Así pues, mi fichero bat tiene la siguiente forma:

Cómo crear un archivo .bat para ejecutar un script de Python

Ahora, debemos guardar este fichero como un fichero .bat. Asimismo, es recomendable darle un nombre que sepamos identificar, en mi caso, suelo dar el mismo nombre que el fichero de Python: automate_flights.bat .

Ahora que hemos creado el fichero, tendremos que automatizarlo usando TaskScheduler.

Automatizar la ejecución de nuestro fichero bat con Task Scheduler

Para crear nuestro ficher bat con Task Scheduler, primero deberemos acceder a Task Scheduler o Programador de tareas y crear una nueva tarea, como a continuación:

Cómo automatizar un script de Python en Windows con Task Scheduler

En la primera pantalla llamada “General” debemos incluir un nombre y descripción de la tarea que vamos a automatizar. Esto nos servirá cuando queramos pausar o modificar esta tarea.

Ajustes generales para crear una automatización con TaskScheduler

Ahora deberemos indicar desde cuando y cuántas veces queremos que se ejecute nuestro código. Esto lo podemos hacer creando un trigger. Para ello, simplemente hay que ir a la pestaña “Desencadenadores” y hacer clic en “Nuevo”.

Una vez ahí nos saldrá una ventana como la siguiente:

Cómo crear un desencadentante o triger de nuestra automatización con TaskScheduler

La primera cuestión es cuándo quieres que se ejecute el código. Aunque puede hacerse cuando inicies sesión o abras una aplicación, lo más normal es que se ejecute mediante una programación. Dentro de la programación, podemos elegir (1) cada cuánto queremos que se ejecute, (2) desde cuándo y (3) cuántas veces al día.

Además, en la sección avanzada podremos modificar aún más el trigger para que, por ejemplo, nuestro script de Python se ejecute cada cinco minutos.

Una vez hayamos configurado el desencadenante como queramos, simplemente debemos darle a “Aceptar”.

Ahora, debemos indicar que se ejecute nuestro fichero .bat. Para ello, simplemente hay que ir a la pestaña “Acciones” y añadir una nueva acción.

En la ventana emergente que surja, dentro de la casilla “Programa o scipt” deberemos elegir el fichero .bat que hemos creado anteriormente:

Cómo crear las acción para automatizar nuestro script de Python en Windows

Por último, en la pestaña “Condiciones” podemos elegir cómo se debe comportar esta automatización en función del estado de energía de nuestro ordenador.

En esa pestaña podemos elegir cosas como ejecutar (o no) la automatización en función de si el ordenador está enchufado a la corriente, o, por ejemplo, si el ordenador se debe encender para ejecutar la automatización.

Estas configuraciones dependerán de la situación de cada uno, pero son, sin duda, importantes.

Cómo configurar las condiciones para automatizar nuestro script de Python en Windows

Una vez hayamos configurado esta pantalla, podremos pulsar “Aceptar” y ya está, ¡nuestro script de Python automatizado en Windows!

Ahora que ya hemos visto cómo automatizar nuestro script de Python en Windows, veamos cómo automatizar nuestro script de Python, pero esta vez en Mac. ¡Vamos a ello!

Automatizar script de Python en Mac

Automatizar nuestro script de Python en Mac es más sencillo que hacerlo en Windows (en mi opinión), aunque se debe hacer por consola.

En este caso, automatizaremos nuestro script de Python mediante un cron job. Para crear un cronjob, debemos abrir la terminal y ejecutar el siguiente comando:

crontab -e

Con esto, se abrirá una sección donde deberemos crear, mediante terminal, nuestro cronjob. Pulsando la tecla i, entraremos en el modo edición. Para ello, debemos indicar lo siguiente:

Aspectos necesarios para automatizar un script de Python en Mac

1. Recurrencia con la que debe ejecutarse el cronjob

Esta recurrencia la definimos mediante una expresión de crontab, que básicamente es una cadena de texto donde cada posición indica: el minuto, la hora, el día del mes, el mes y el día de la semana en la que queremos que se ejecute, siendo el asterisco * la forma de indicar cualquiera (como en una expresión regular).

Así pues, una automatización que se ejecute cada día a las 9 de la mañana será: 0 9 * * *. Una automatización que se ejecute todos los días cada minuto será: * * * * *. Sé que esto puede ser algo complicado, por eso, te recomendaría usaras herramientas como crontab guru para asegurarte de que tu fecha cron es correcta.

2. Directorio donde se encuentra el script de Python que quieras automatizar

Para copiar la ruta en la que se encuentra el fichero, simplemente debes ir a la carpeta en la que se encuentra el fichero y pulsar Cmd-Opt-C . Con este atajo de teclado habrás copiado la dirección de la carpeta en el portapapeles (enlace).

Ahora, simplemente deberás pegar esa dirección y eliminar el nombre del archivo, ya que en este caso necesitamos la ruta del fichero, pero sin incluir el nombre del mismo. En mi caso, por ejemplo, la ruta es la siguiente: /Users/afernandez/Desktop/.

3. Ruta en la que se encuentra Python instalado

La forma más sencilla de conocer la ruta en la que se encuentra Python instalado es simplemente ejecutando el siguiente código en terminal:

which python

Tras correr este comando, simplemente tendremos que copiar y pegar la ruta que nos aparezca.

4. Nombre del script de Python

Copiar el nombre del script de Python no tiene mayor complejidad. Simplemente se debe ir a la ruta en la que se encuentra el fichero, pulsar enter sobre el mismo y copiar el nombre que aparezca.

Creación del cronjob para automatizar nuestro script de Python en Mac

Ahora que ya tenemos todos nuestros ingredientes, el comando que deberemos para crear nuestro cronjob tendrá la siguiente forma:

Comando que deberemos incluir en cronjob

En mi caso, quiero automatizar el script para que se ejecute todos los días a cada minuto, por lo que mi comando tiene la siguiente forma:

# Automate Python script
* * * * * * cd /Users/afernandez/Desktop/ && /opt/anaconda3/bin/python automate_flights.py

Así pues, introducimos esto en nuestra pestaña de contrabs y pulsaremos la tecla esc para salir del modo edición (recuerda que para entrar al modo edición deberás haber pulsado la tecla i, tal como he explicado más arriba).

Con esto ya tendríamos nuestro crontab creado. Ahora para salir de la pestaña y volver a la terminal simplemente hay que escribir :wq y pulsar enter.

Ahora que estamos en la terminal, podemos comprobar si nuestro script se ha automatizado correctamente. Para ello, puedes revisar si el cronjob que has creado aparece en el listado de cronjobs del ordenador. Esto lo puedes hacer con el siguiente comando:

crontab -l

En nuestro caso, veremos como aparece el cronjob que acabamos de crear:

Cómo comprobar que hemos creado correctamente el cronjon en Mac

¡Ya tenemos nuestro script de Python automatizado en Mac! Ahora, si quisieras borrarlo, sería tan simple como:

  1. Entrar en el editor de cronjobs, mediante el comando crontab -e y entrar en el modo edición pulsando i.
  2. Eliminar el texto del cronjob que quieras eliminar.
  3. Salir del modo edición pulsando esc y salir del modo edición introducienco :wq y pulsando el enter.

Conclusiones

En definitiva, automatizar un script de Python, ya sea en Windows o Mac es algo muy sencillo y que puede llevar tus scripts al siguiente nivel. Yo, personalmente, he ahorrado mucho trabajo a mi y a los clientes para los que trabajo mediante automatizaciones.

Así que, si hay alguna labor que hagas de forma rutinaria, ya no tienes excusa para automatizarla y ser más eficiente! 😉

Esto ha sido todo en este post. Espero que te haya gustado. Si es así y quieres estar al tanto de los posts que voy subiendo (ya llevo 41 posts, de los cuales 21 son en Python), te recomiendo que te suscribas. En cualquier caso, ¡nos vemos en el siguiente post!