Pythonから外部プログラムを呼び出したい。私はとの両方Popen()
を使用call()
しました。
2つの違いは何ですか?
私の具体的な目標は、Pythonから次のコマンドを実行することです。リダイレクトの仕組みがわかりません。
./my_script.sh > output
ドキュメンテーションを読み、それはcall()
便利な機能またはショートカット機能であると言います。call()
代わりにを使用することにより、電力が失われ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
ブロックしません。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
です。
call()
非常に明確なようです。引用やリンクを提供して、回答で何に重点を置くべきかを知っていただけますか?