Führen Sie ein PowerShell-Skript aus dem Python-Programm heraus aus
-
Python-Methode
subprocess.Popen()
-
Führen Sie ein PowerShell-Skript innerhalb des Python-Programms mit der
Popen()
-Methode aus
Windows PowerShell besteht aus Dutzenden von integrierten Cmdlets, die eine Vielzahl von Funktionen bereitstellen. Einige dieser Funktionen sind einzigartig und nur über PowerShell verfügbar; Daher ist es sehr nützlich, wenn wir PowerShell-Skripte in anderen Programmiersprachen wie Python verwenden können.
Dieser Artikel konzentriert sich auf die Ausführung von PowerShell-Logik aus Python-Code.
Python-Methode subprocess.Popen()
In Python können die externen Programme mit der Methode subprocess.Popen()
ausgeführt werden. Das subprocess
-Modul besteht aus mehreren effizienteren Methoden als denen, die im alten os
-Modul verfügbar sind; Daher wird empfohlen, das Modul subprocess
anstelle des Moduls os
zu verwenden.
Da wir einen PowerShell-Code aus dem Python-Programm ausführen werden, ist der bequemste Ansatz die Verwendung der Klasse Popen
im Modul subprocess
. Es erstellt einen separaten untergeordneten Prozess, um ein externes Programm auszuführen.
Beachten Sie jedoch, dass dieser Prozess plattformabhängig ist.
Immer wenn Sie subprocess.Popen()
aufrufen, wird der Popen
-Konstruktor aufgerufen. Es akzeptiert mehrere Parameter, wie im Folgenden gezeigt.
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)
Mit dem Argument args
wird der Befehl übergeben, der das externe Programm startet. Es gibt zwei Möglichkeiten, den Befehl mit seinen Parametern zu übergeben.
-
Als Folge von Argumenten
Popen(["path_to_external_program_executable", "command_args1", "command_args2", ...])
-
Als einzelne Befehlszeichenfolge
Popen('path_to_external_program_executable -command_param1 arg1 -command_param2 arg2 ...')
Die Reihenfolge der Argumente wird beim Konstruktor Popen
empfohlen.
Das nächste wichtige Argument ist der Parameter stdout
, den wir im nächsten Abschnitt verwenden werden. Dies gibt die Standardausgabe an, die der Prozess verwenden soll.
Führen Sie ein PowerShell-Skript innerhalb des Python-Programms mit der Popen()
-Methode aus
Erstellen Sie zunächst ein einfaches PowerShell-Skript, das im Konsolenfenster gedruckt wird.
Write-Host 'Hello, World!'
Wir speichern es als sayhello.ps1
.
Als nächstes erstellen wir ein Python-Skript, runpsinshell.py
. Da wir den Befehl subprocess.Popen()
verwenden werden, müssen wir zuerst das Modul subprocess
importieren.
import subprocess
Dann rufen wir den Konstruktor Popen
mit den Parametern args
und stdout
auf, wie im Folgenden gezeigt.
p = subprocess.Popen(["powershell.exe", "D:\\codes\\sayhello.ps1"], stdout=sys.stdout)
Wie Sie sehen können, wurden die Argumente als Sequenz übergeben, was der empfohlene Weg ist. Das erste Argument ist der ausführbare Name des externen Programms, und das nächste ist der Dateipfad zum zuvor erstellten PowerShell-Skript.
Eine weitere wichtige Sache, die Sie sich merken sollten, ist, dass wir den Standardausgabeparameter als sys.stdout
angeben sollten. Um die sys.stdout
in Ihrem Python-Programm zu verwenden, müssen wir auch das Modul sys
importieren.
Das endgültige Programm sollte wie folgt aussehen.
import subprocess
import sys
p = subprocess.Popen(["powershell.exe", "D:\\codes\\sayhello.ps1"], stdout=sys.stdout)
p.communicate()
Lassen Sie uns schließlich das Python-Programm ausführen, wie im Folgenden gezeigt.
python .\runpsinshell.py
Ausgang:
Wie erwartet wurde das PowerShell-Skript aus dem Python-Code ausgeführt und das Hello, World!
ausgegeben. string in das PowerShell-Fenster.
Das Python-Programm kann auch geschrieben werden, indem die Konstruktorargumente Popen
als einzelne Zeichenfolge übergeben werden.
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.