subprocess.Popen()
とos.system()
の違いは何ですか?
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()
と考えてください。
subprocess.Popen()
は、os.system()
の厳密なスーパーセットです。
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を間違いなく使用してください。実行するためのすべての機能に加えて、プロセスをさらに制御できるからです。
サブプロセスはpopen2に基づいているため、多くの利点があります。 PEP here には完全なリストがありますが、いくつかは次のとおりです。
Windowsでpython(cpython)を実行すると、<built-in function system>
os.system はカーテンの下で実行されます _ wsystem 非Windows OSを使用している場合は、 system を使用します。
それどころか、PopenはWindowsでは CreateProcess を使用し、posixベースのオペレーティングシステムでは _ posixsubprocess.fork_exec を使用する必要があります。
とはいえ、重要なアドバイスは os.system docsから来ています。
Subprocessモジュールは、新しいプロセスを生成してその結果を取得するためのより強力な機能を提供します。このモジュールを使用することは、この関数を使用するよりも望ましいです。役立つレシピについては、サブプロセスのドキュメントの「古い関数をサブプロセスモジュールに置き換える」セクションをご覧ください。