Ejecute un script de PowerShell desde dentro del programa Python

Migel Hewage Nimesha 15 febrero 2024
  1. Método subproceso.Popen() de Python
  2. Ejecute un script de PowerShell desde dentro del programa Python utilizando el método Popen()
Ejecute un script de PowerShell desde dentro del programa Python

Windows PowerShell consta de decenas de cmdlets integrados, que proporcionan un amplio conjunto de funciones. Algunas de estas características son únicas y solo están disponibles a través de PowerShell; por lo tanto, es muy útil si podemos usar scripts de PowerShell dentro de otros lenguajes de programación como Python.

Este artículo se centrará en la ejecución de la lógica de PowerShell desde el código de Python.

Método subproceso.Popen() de Python

En Python, los programas externos se pueden ejecutar utilizando el método subprocess.Popen(). El módulo subprocess consta de varios métodos más eficientes que los disponibles en el antiguo módulo os; por lo tanto, se recomienda utilizar el módulo subprocess en lugar del módulo os.

Dado que ejecutaremos un código de PowerShell desde el programa Python, el enfoque más conveniente es usar la clase Popen en el módulo subproceso. Crea un proceso secundario separado para ejecutar un programa externo.

Lo único a tener en cuenta es que este proceso depende de la plataforma.

Cada vez que llama a subprocess.Popen(), se llama al constructor Popen. Acepta múltiples parámetros, como se muestra a continuación.

subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

El argumento args se usa para pasar el comando que inicia el programa externo. Hay dos formas de pasar el comando con sus parámetros.

  1. Como una secuencia de argumentos

    Popen(["path_to_external_program_executable", "command_args1", "command_args2", ...])
    
  2. Como una sola cadena de comando

    Popen('path_to_external_program_executable -command_param1 arg1 -command_param2 arg2 ...')
    

Se recomienda la secuencia de argumentos con el constructor Popen.

El siguiente argumento importante es el parámetro stdout que usaremos en la siguiente sección. Esto especifica la salida estándar que debe usar el proceso.

Ejecute un script de PowerShell desde dentro del programa Python utilizando el método Popen()

Primero, cree un script de PowerShell simple que se imprima en la ventana de la consola.

Write-Host 'Hello, World!'

Lo guardaremos como sayhello.ps1.

A continuación, crearemos un script de Python, runpsinshell.py. Como usaremos el comando subprocess.Popen(), primero debemos importar el módulo subprocess.

import subprocess

Luego llamaremos al constructor Popen con los parámetros args y stdout, como se muestra a continuación.

p = subprocess.Popen(["powershell.exe", "D:\\codes\\sayhello.ps1"], stdout=sys.stdout)

Como puede ver, los argumentos se han pasado como una secuencia, que es la forma recomendada. El primer argumento es el nombre del ejecutable del programa externo y el siguiente es la ruta del archivo al script de PowerShell creado anteriormente.

Otra cosa importante a recordar es que debemos especificar el parámetro de salida estándar como sys.stdout. Para usar el sys.stdout en su programa Python, también debemos importar el módulo sys.

El programa final debería verse de la siguiente manera.

import subprocess
import sys

p = subprocess.Popen(["powershell.exe", "D:\\codes\\sayhello.ps1"], stdout=sys.stdout)
p.communicate()

Finalmente, ejecutemos el programa Python, como se muestra a continuación.

python .\runpsinshell.py

Producción:

Ejecutar un script de PowerShell desde un programa de Python - Salida

Como era de esperar, el script de PowerShell se ejecutó desde el código de Python e imprimió el ¡Hola, mundo! cadena a la ventana de PowerShell.

El programa de Python también se puede escribir pasando los argumentos del constructor Popen como una sola cadena.

import subprocess
import sys

p = subprocess.Popen(
    'powershell.exe -ExecutionPolicy RemoteSigned -file 	 "D:\\codes\\sayhello.ps1"',
    stdout=sys.stdout,
)

p.communicate()
Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.