Lathack

Ejecución de comandos con Python

Ejecución de comandos con Python

En el desarrollo de scripts o programas, una tarea frecuente es la de tener que llamar a un programa para leer el resultado que imprime en pantalla. Para estos casos, la librería estándar de este lenguaje nos ofrece el módulo subprocess para la ejecución de comandos con Python.

Módulo subprocess

El módulo subprocess es mucho más completo e interactivo con respecto a la ejecución de comandos que podemos hacer en os. Este nos ofrece diversos usos y utilidades que veremos a continuación

Supongamos que queremos ejecutar un comando en la consola Windows. Por ejemplo:

mkdir nueva_carpeta

La función de mkdir es la de crear un directorio (make directory). Para ejecutar este comando del sistema operativo desde Python, deberemos usar la función subprocess.run() del siguiente modo:

import subprocess

subprocess.run([“mkdir”, “Nuevo Directorio”], shell=True)

Veamos un ejemplo desde nuestra consola. Para esto, nos colocaremos dentro de la carpeta “pruebas”, cuyo contenido es solo de un directorio llamado “Directorio1”. Por tanto, procederemos a crear nuestro nuevo directorio:

Podemos observar que el primer argumento de run() es una lista en donde el primer elemento es el nombre del comando o programa que se quiere ejecutar, y los subsiguientes son los argumentos para dicho comando o programa (tal cual como lo vimos con sys.argv). El parámetro shell=True indica que se trata de un comando de la terminal o símbolo del sistema de Windows. Recordemos que “True” siempre debe ir con la “T” en mayúscula.

Algunos ejemplos

Ahora vamos a hacer una prueba con un comando que imprima información en la consola y queramos analizar desde Python. Por ejemplo, tanto en Linux como en Windows, el comando hostname, indica el nombre del host actual, o whoami, que imprime el nombre del usuario. Por ejemplo:

C:\Users\lathack > hostname

Out:

DESKTOP-0FR1OHE

C:\Users\lathack > whoami

Out:

desktop-0fr1ohe\lathack

Teniendo esto en cuenta, vamos a ejecutar el comando hostname desde Python y guardar el resultado. Es decir, lo que imprime en consola, en este caso «DESKTOP-0FR1OHE» en una variable. Para esto usaremos lo siguiente:

import subprocess

n = subprocess.run([“hostname”, capture_output=True, encoding=”cp850”)

print(n,stdout)

Veamos a continuación:

Ejecución de comandos con Python

Podemos ver que el n.stdout contiene el resultado del comando como una cadena.

Conclusión

Cuando realizamos una ejecución de comandos con Python con este módulo, debemos tener en cuenta los siguientes aspectos:

  • El primer argumento es una cadena y no una lista. Por tanto, esto es válido porque el comando no contiene espacios, entonces, se puede pasar directamente una cadena.

  • El argumento capture_output=True le indica a la función run() que debe capturar el resultado del comando (esto hace referencia al nombre del host).

  • El argumento encoding=»cp850″ indica la codificación de caracteres usada por defecto por la consola de Windows. No es relevante en este momento, de igual modo, recordemos usarlo tal como lo hemos hecho recién siempre que queramos leer el resultado de un comando desde Python.

  • No especificamos el parámetro shell=True. Esto es porque hostname  en realidad, es un programa, no un comando. Podemos observar esto escribiendo where hostname en la consola, lo cual nos revelará la ubicación del programa. Por lo tanto, siempre que ejecutemos un programa en lugar de un comando debemos evitar el parámetro shell.

  • En las distribuciones basadas en Linux la codificación de la terminal es, generalmente UTF-8, de modo que el argumento pasado run() no deberá ser “encoding=utf-8”. Para esto, la variable os.name, contiene el nombre del sistema operativo, en el cual podemos basarnos para determinar el valor correcto del argumento: “utf-8”si os.name==“posix” o “cp850” si os.name==“nt”.

Recordar

Si ejecutamos este mismo código desde la consola interactiva, podremos ver que p.stdout contiene el resultado del comando:

import subprocess

p = subprocess.run(«hostname»,capture_output=True, encoding=»cp850″)

p.stdout

Out:

‘DESKTOP-0FR1OHE\n’

Si queremos eliminar el salto de línea al final de la cadena, podemos hacerlo vía strip():

p.stdout.strip()

Out:

‘DESKTOP-0FR1OHE’

El primer argumento de run() puede ser la ruta completa a un programa, o directamente el llamado al mismo, por ejemplo:

datos = subprocess.run([«python»,»–version»],capture_output=True,encoding=»cp850″)

datos.stdout

Out:

‘Python 3.10.0\n’

Esto invoca el programa “python” con el argumento –version, que imprime en consola la versión de Python. Recordemos que hay otras formas de ver la salida por pantalla. Por ejemplo:

Ejecución de comandos con Python   

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

2 × cuatro =

Lathack
Scroll al inicio