HOWTO · Python
Cómo ejecutar un comando de Windows CMD y obtener la salida en Python
Ejecute comandos de Windows CMD desde Python con os.system(), o capture la salida de los comandos con tuberías mediante el módulo subprocess.
En esta página
Para ejecutar un comando de Windows CMD desde Python, use os.system() cuando solo necesite que el comando muestre su salida en la consola. Esta función devuelve un valor de estado, no la salida del comando como una cadena de Python. Si Python necesita leer esa salida, use el módulo subprocess con tuberías y communicate().
Ejecutar comandos CMD desde un script de Python y obtener la salida con os.system()
La función os.system() pasa un comando al procesador de comandos del sistema operativo. En Windows, un ejemplo sencillo es os.system("cmd /c echo hello"): CMD ejecuta echo hello y el texto aparece en la consola. El valor que devuelve la función indica el estado del comando; no contiene el texto mostrado.
Use este método para ejecutar un comando sencillo cuya salida pueda leer una persona. Estos ejemplos usan la sintaxis de Windows CMD: dir, cd y md son nombres de comandos que se usan allí, y los tres son comandos integrados de CMD. El nombre cd también se usa en otros intérpretes de comandos, así que estos nombres no son exclusivos de Windows. Si necesita el resultado del comando dentro de su programa de Python, o quiere gestionar por separado la salida estándar y la salida de error estándar, use subprocess.
Evite construir una cadena de comando a partir de datos que no sean de confianza. El procesador de comandos puede interpretar los metacaracteres del intérprete como sintaxis, así que, al usar os.system(), ejecute únicamente comandos fijos y de confianza.
Ejecutar comandos CMD desde un script de Python y obtener la salida con el módulo subprocess
Use subprocess.Popen() para iniciar un proceso con tuberías independientes para la salida estándar y la salida de error estándar. Al llamar a communicate(), se leen ambas secuencias y se espera a que termine el proceso. Así se evita un interbloqueo que puede ocurrir si una tubería se llena mientras no se lee. Los valores capturados son bytes; antes de procesarlos como texto, decodifíquelos con la codificación que usa el comando.
Este ejemplo autónomo usa CMD en Windows y el intérprete de Python actual en otros sistemas, por lo que puede adaptar este patrón de captura a ambas plataformas. Imprime la línea capturada:
import os
import subprocess
import sys
if os.name == "nt":
command = ["cmd", "/c", "echo", "hello"]
else:
command = [sys.executable, "-c", "print('hello')"]
process = subprocess.Popen(
command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
stdout, stderr = process.communicate()
print(stdout.decode("utf-8").strip())
hello
En Windows, cmd /c ejecuta el comando y después se cierra; /k lo ejecuta, pero deja abierto el procesador de comandos, lo que normalmente no conviene en un script. Con el valor predeterminado shell=False, Python inicia directamente el ejecutable indicado sin lanzar otro intérprete para analizar sus argumentos. Sin embargo, cuando ese ejecutable es cmd, cmd sigue analizando su línea de comandos e interpretando la sintaxis de CMD; shell=False no hace seguros los valores que no son de confianza. Nunca introduzca datos que no sean de confianza en una línea de comandos de CMD. Prefiera invocar un ejecutable independiente directamente con una lista de argumentos cuando sea posible. Si el comando genera texto que no está codificado en UTF-8, decodifique los bytes capturados con la codificación que utiliza. Consulte process.returncode si necesita determinar si el proceso terminó correctamente o con un error.
Para obtener más información, consulte la documentación de Python sobre subprocess.