web-dev-qa-db-ja.com

subprocess.Popenとos.systemの違い

subprocess.Popen()os.system()の違いは何ですか?

94
Arovit

Python docs のサブプロセスセクションをチェックアウトすると、os.system()subprocess.Popen()に置き換える方法の例があります。

sts = os.system("mycmd" + " myarg")

...と同じことをします...

sts = Popen("mycmd" + " myarg", Shell=True).wait()

「改善された」コードはより複雑に見えますが、一度subprocess.Popen()を知ったら、他に何も必要ないので、より良いです。 subprocess.Popen()は、他の3つのPythonモジュールに散在する他のいくつかのツール(os.system()はそのうちの1つにすぎません)を置き換えます。

役立つ場合は、subprocess.Popen()を非常に柔軟なos.system()と考えてください。

85
Jacob Marble

subprocess.Popen()は、os.system()の厳密なスーパーセットです。

39
Jan Hudec

os.systemはUnix system コマンドと同等ですが、サブプロセスはPopenコマンドによって提供される多くの機能をより簡単で制御可能なインターフェイスに提供するために作成されたヘルパーモジュールでした。これらは nix Popen コマンドと同様に設計されました。

system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed

どこに

The popen() function opens a process by creating a pipe, forking, and invoking the Shell.

どちらを使用するかを考えている場合は、subprocessを間違いなく使用してください。実行するためのすべての機能に加えて、プロセスをさらに制御できるからです。

21
Senthil Kumaran

サブプロセスはpopen2に基づいているため、多くの利点があります。 PEP here には完全なリストがありますが、いくつかは次のとおりです。

  • シェルでパイプを使用する
  • より良い改行サポート
  • 例外処理の改善
20
Andy Mikula

Windowsでpython(cpython)を実行すると、<built-in function system>os.system はカーテンの下で実行されます _ wsystem 非Windows OSを使用している場合は、 system を使用します。

それどころか、PopenはWindowsでは CreateProcess を使用し、posixベースのオペレーティングシステムでは _ posixsubprocess.fork_exec を使用する必要があります。

とはいえ、重要なアドバイスは os.system docsから来ています。

Subprocessモジュールは、新しいプロセスを生成してその結果を取得するためのより強力な機能を提供します。このモジュールを使用することは、この関数を使用するよりも望ましいです。役立つレシピについては、サブプロセスのドキュメントの「古い関数をサブプロセスモジュールに置き換える」セクションをご覧ください。

2
BPL