Python プログラム内から PowerShell スクリプトを実行する

Migel Hewage Nimesha 2023年6月21日
  1. Python subprocess.Popen() メソッド
  2. Popen() メソッドを使用して Python プログラム内から PowerShell スクリプトを実行する
Python プログラム内から PowerShell スクリプトを実行する

Windows PowerShell は、豊富な機能セットを提供する数十の組み込みコマンドレットで構成されています。 これらの機能の一部は独自のもので、PowerShell 経由でのみ使用できます。 したがって、Python などの他のプログラミング言語内で PowerShell スクリプトを使用できると非常に便利です。

この記事では、Python コードから PowerShell ロジックを実行することに焦点を当てます。

Python subprocess.Popen() メソッド

Python では、subprocess.Popen() メソッドを使用して外部プログラムを実行できます。 subprocess モジュールは、古い os モジュールで利用できるメソッドよりも効率的ないくつかのメソッドで構成されています。 したがって、os モジュールの代わりに subprocess モジュールを使用することをお勧めします。

Python プログラムから PowerShell コードを実行するため、最も便利な方法は、subprocess モジュールで Popen クラスを使用することです。 外部プログラムを実行する別の子プロセスを作成します。

注意すべきことは、このプロセスはプラットフォームに依存するということです。

subprocess.Popen() を呼び出すたびに、Popen コンストラクターが呼び出されます。 以下に示すように、複数のパラメーターを受け入れます。

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)

引数 args は、外部プログラムを開始するコマンドを渡すために使用されます。 パラメータを指定してコマンドを渡す方法は 2つあります。

  1. 引数のシーケンスとして

    Popen(["path_to_external_program_executable", "command_args1", "command_args2", ...])
    
  2. 単一のコマンド文字列として

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

引数のシーケンスは、Popen コンストラクターで推奨されます。

次の重要な引数は、次のセクションで使用する stdout パラメータです。 これは、プロセスが使用する標準出力を指定します。

Popen() メソッドを使用して Python プログラム内から PowerShell スクリプトを実行する

まず、コンソール ウィンドウに出力する簡単な PowerShell スクリプトを作成します。

Write-Host 'Hello, World!'

sayhello.ps1 として保存します。

次に、Python スクリプト runpsinshell.py を作成します。 subprocess.Popen() コマンドを使用するため、最初に subprocess モジュールをインポートする必要があります。

import subprocess

次に、以下に示すように、args および stdout パラメーターを使用して Popen コンストラクターを呼び出します。

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

ご覧のとおり、引数は推奨される方法であるシーケンスとして渡されています。 最初の引数は外部プログラムの実行可能ファイル名で、次の引数は以前に作成した PowerShell スクリプトへのファイル パスです。

覚えておくべきもう 1つの重要なことは、標準出力パラメーターを sys.stdout として指定する必要があるということです。 Python プログラムで sys.stdout を使用するには、sys モジュールもインポートする必要があります。

最終的なプログラムは次のようになります。

import subprocess
import sys

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

最後に、次のように Python プログラムを実行してみましょう。

python .\runpsinshell.py

出力:

Python プログラムから PowerShell スクリプトを実行する - 出力

予想どおり、PowerShell スクリプトが Python コードから実行され、Hello, World!が出力されました。 文字列を PowerShell ウィンドウに追加します。

Python プログラムは、Popen コンストラクタ引数を単一の文字列として渡すことによっても記述できます。

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.