Ejecute un script de PowerShell desde dentro del programa Python
-
Método
subproceso.Popen()
de Python -
Ejecute un script de PowerShell desde dentro del programa Python utilizando el método
Popen()
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.
-
Como una secuencia de argumentos
Popen(["path_to_external_program_executable", "command_args1", "command_args2", ...])
-
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:
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()
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.