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つあります。
-
引数のシーケンスとして
Popen(["path_to_external_program_executable", "command_args1", "command_args2", ...])
-
単一のコマンド文字列として
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
出力:
予想どおり、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()
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.