サブプロセスPopenと呼び出しの違いは何ですか(どのように使用できますか)?


178

Pythonから外部プログラムを呼び出したい。私はとの両方Popen()を使用call()しました。

2つの違いは何ですか?

私の具体的な目標は、Pythonから次のコマンドを実行することです。リダイレクトの仕組みがわかりません。

./my_script.sh > output

ドキュメンテーションを読みそれはcall()便利な機能またはショートカット機能であると言います。call()代わりにを使用することにより、電力が失われPopen()ますか?


ドキュメントのどの部分が混乱しましたか?の定義はcall()非常に明確なようです。引用やリンクを提供して、回答で何に重点を置くべきかを知っていただけますか?
S.Lott、2011年

回答:


265

リダイレクトを行うには2つの方法があります。どちらもsubprocess.Popenまたはに適用されますsubprocess.call

  1. キーワード引数を設定しshell = Trueたりexecutable = /path/to/the/shell、あなたがそこにそれを持っているだけのようにコマンドを指定します。

  2. 出力をファイルにリダイレクトしているだけなので、キーワード引数を設定します

    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です。


17
基本的に、PopenとcallはそれぞれLinuxコマンドを実行するために使用される非同期関数と同期関数です。
user3016020

1
ポペンを使用する利点は何ですか?呼び出されたプログラムが最初に終了するまで待つのは安全ではないでしょうか?
トム・

4
@Tomよくない。出力を読み取り、プログラムにさらに入力を送信し、その入力から得られる出力をさらに読み取り、繰り返したい場合はどうでしょうか?
agf 2016年

@ user3016020これはWindowsコマンドにも当てはまると思いますか?正しい?
domih

7

もう1つの答えは非常に完全ですが、経験則は次のとおりです。

  • call をブロックしています:

    call('notepad.exe')
    print('hello')  # only executed when notepad is closed
  • Popen ノンブロッキングです:

    Popen('notepad.exe')
    print('hello')  # immediately executed
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.