Python Language
サブプロセスライブラリ
サーチ…
構文
- subprocess.call(args、*、stdin = None、stdout = None、stderr = None、shell = False、timeout = None)
- サブプロセス.Popen(args、bufsize = -1、実行可能=なし、stdin =なし、stdout =なし、stderr =なし、preexec_fn =なし、close_fds = True、shell = False、cwd =なし、env =なし、universal_newlines = False 、startupinfo = None、creationflags = 0、restore_signals = True、start_new_session = False、pass_fds =())
パラメーター
パラメータ | 詳細 |
---|---|
args | 単一の実行可能ファイル、または実行可能ファイルと引数のシーケンス - 'ls' 、 ['ls', '-la'] |
shell | シェルの下で実行しますか? POSIXの/bin/sh へのデフォルトシェル。 |
cwd | 子プロセスの作業ディレクトリ。 |
外部コマンドの呼び出し
最も単純な使用例は、 subprocess.call
関数の使用です。最初の引数としてリストを受け入れます。リストの最初の項目は、呼び出す外部アプリケーションでなければなりません。リストの他の項目は、そのアプリケーションに渡される引数です。
subprocess.call([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])
シェルコマンドの場合は、 shell=True
と設定し、コマンドをリストではなく文字列として指定します。
subprocess.call('echo "Hello, world"', shell=True)
上記の2つのコマンドは、サブプロセスのexit status
のみを返します。さらに、 shell=True
を使用するときはセキュリティ上の問題があるので注意してください( ここを参照)。
あなたがサブプロセスの標準出力を得ることができるようにしたい場合は、代わりsubprocess.call
しsubprocess.check_output
。より高度な使い方については、 これを参照してください。
Popenによる柔軟性の向上
subprocess.Popen
を使用すると、起動されたプロセスをsubprocess.call
より細かく制御できます。
サブプロセスの起動
process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])
Popen
のシグネチャは、 call
関数に非常によく似ていcall
。しかし、 Popen
はcall
ようにサブプロセスが完了するのを待つ代わりに、すぐに戻ります。
完了するためにサブプロセスを待っている
process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])
process.wait()
サブプロセスからの出力の読み込み
process = subprocess.Popen([r'C:\path\to\app.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# This will block until process completes
stdout, stderr = process.communicate()
print stdout
print stderr
実行中のサブプロセスへの対話型アクセス
サブプロセスが完了していなくても、 stdin
とstdout
を読み書きすることができます。これは、別のプログラムの機能を自動化する場合に便利です。
サブプロセスへの書き込み
process = subprocess.Popen([r'C:\path\to\app.exe'], stdout = subprocess.PIPE, stdin = subprocess.PIPE)
process.stdin.write('line of input\n') # Write input
line = process.stdout.readline() # Read a line from stdout
# Do logic on line read.
ただし、動的なやりとりではなく、入出力のセットが1つだけ必要な場合は、 stdin
とstdout
直接アクセスするのではなく、 communicate()
を使用する必要があります。
サブプロセスからストリームを読み込む
サブプロセスの出力を行単位で確認する場合は、次のスニペットを使用できます。
process = subprocess.Popen(<your_command>, stdout=subprocess.PIPE)
while process.poll() is None:
output_line = process.stdout.readline()
サブコマンド出力にEOL文字が含まれていない場合、上記のスニペットは機能しません。出力された文字を次のように文字で読み取ることができます。
process = subprocess.Popen(<your_command>, stdout=subprocess.PIPE)
while process.poll() is None:
output_line = process.stdout.read(1)
1
の引数として指定されたread
方法は、一度に1つの文字を読むために読んで伝えます。別の番号を使用して、必要な数の文字を読み取るように指定することができます。負の数または0は、EOFに遭遇するまで、単一の文字列としてread
ように指示しread
( ここを参照 )。
上記の両方のスニペットでは、サブプロセスが終了するまでprocess.poll()
はNone
なります。これは、読み出せる出力がなくなったらループを終了するために使用されます。
同様の手順をサブプロセスのstderr
に適用することができます。
コマンドリストの引数を作成する方法
コマンドを実行できるサブプロセスメソッドは、少なくともshell_mode=True
を使用して、リスト形式のコマンドを必要とします。
リストを作成するためのルールは、特に複雑なコマンドの場合は、必ずしも直感的ではありません。幸いにも、それを可能にする非常に有用なツールがあります: shlex
。コマンドとして使用するリストを作成する最も簡単な方法は次のとおりです。
import shlex
cmd_to_subprocess = shlex.split(command_used_in_the_shell)
簡単な例:
import shlex
shlex.split('ls --color -l -t -r')
out: ['ls', '--color', '-l', '-t', '-r']