Führen Sie ein PowerShell-Skript aus dem Python-Programm heraus aus

Migel Hewage Nimesha 15 Februar 2024
  1. Python-Methode subprocess.Popen()
  2. Führen Sie ein PowerShell-Skript innerhalb des Python-Programms mit der Popen()-Methode aus
Führen Sie ein PowerShell-Skript aus dem Python-Programm heraus 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.

  1. Als Folge von Argumenten

    Popen(["path_to_external_program_executable", "command_args1", "command_args2", ...])
    
  2. 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:

Ausführen eines PowerShell-Skripts aus einem Python-Programm – Ausgabe

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()
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.