サーチ…


構文

  • 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.callsubprocess.check_output 。より高度な使い方については、 これを参照しください。

Popenによる柔軟性の向上

subprocess.Popenを使用すると、起動されたプロセスをsubprocess.callより細かく制御できます。

サブプロセスの起動

process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])

Popenのシグネチャは、 call関数に非常によく似ていcall 。しかし、 Popencallようにサブプロセスが完了するのを待つ代わりに、すぐに戻ります。

完了するためにサブプロセスを待っている

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

実行中のサブプロセスへの対話型アクセス

サブプロセスが完了していなくても、 stdinstdoutを読み書きすることができます。これは、別のプログラムの機能を自動化する場合に便利です。

サブプロセスへの書き込み

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つだけ必要な場合は、 stdinstdout直接アクセスするのではなく、 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']


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow