サブプロセスPopenと呼び出しの違いは何ですか(どのように使用できますか)?
Pythonから外部プログラムを呼び出したい。そのためにPopen()
とcall()
の両方を使用しました。
2つの違いは何ですか?
私の具体的な目標は、Pythonから次のコマンドを実行することです。リダイレクトの仕組みがわかりません。
./my_script.sh > output
ドキュメント を読んで、call()
は便利な関数またはショートカット関数であると言っています。 call()
の代わりにPopen()
を使用することにより、パワーを失いますか?
リダイレクトを行うには2つの方法があります。両方ともsubprocess.Popen
またはsubprocess.call
に適用されます。
キーワード引数
Shell = True
またはexecutable = /path/to/the/Shell
を設定し、そこにあるとおりにコマンドを指定します。出力をファイルにリダイレクトしているだけなので、キーワード引数を設定します
stdout = an_open_writeable_file_object
ここで、オブジェクトは
output
ファイルを指します。
subprocess.Popen
は subprocess.call
より一般的です。
Popen
はブロックしないため、実行中のプロセスと対話したり、Pythonプログラムで他のことを続行したりできます。 Popen
の呼び出しは、Popen
オブジェクトを返します。
call
doesブロック。 Popen
コンストラクターと同じ引数をすべてサポートしているため、プロセスの出力や環境変数などを設定できますが、スクリプトはプログラムが完了するまで待機し、call
はコードを返しますプロセスの終了ステータスを表します。
returncode = call(*args, **kwargs)
基本的に呼び出しと同じです
returncode = Popen(*args, **kwargs).wait()
call
は単なる便利な関数です。 CPythonでの実装は subprocess.py にあります:
def call(*popenargs, timeout=None, **kwargs):
"""Run command with arguments. Wait for command to complete or
timeout, then return the returncode attribute.
The arguments are the same as for the Popen constructor. Example:
retcode = call(["ls", "-l"])
"""
with Popen(*popenargs, **kwargs) as p:
try:
return p.wait(timeout=timeout)
except:
p.kill()
p.wait()
raise
ご覧のとおり、これはPopen
を囲む薄いラッパーです。