subprocess.Popenとos.systemの違い


回答:


99

あなたがチェックアウトする場合は、Pythonのドキュメントのサブプロセスセクションを、あなたは、交換方法の例があり気づくos.system()とはsubprocess.Popen()

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

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

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

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

それが役立つ場合は、subprocess.Popen()非常に柔軟であると考えてくださいos.system()


sts = p.wait()最終行の代わりに使用することもできます。
Sven Marnach、2011年

1
@JacobMarbleでは、別のpythonスクリプトからセレンスクレイピングスクリプトを呼び出しているとしましょう。スクレイピングスクリプトを完了してから、次のコード行を実行できるのはどれですか。のように、実行を続行する前に私の削り取りが完了する必要があります。
Prakhar Mohan Srivastava 2015

また、可能であれば回避する必要があることを指摘するために、stackoverflow.com / questions / 3172470 / … についても言及しますshell=True。このオプションがあることはsubprocess.Popen()、そのヘルパー機能の利点の1つです。
Tripleee 2017

@PrakharMohanSrivastavaフローをブロックし、コマンドがその作業を完了するのを待つ場合は、チェックアウトしてください:stackoverflow.com/a/2837319/5252192
AmirHossein

一般的には@PrakharMohanSrivastava、両方os.systemsubprocess.call/popen/run仕上げにコマンドのブロック/待機を行います。stackoverflow.com/a/14059648/4752883
alpha_989


23

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

system()を呼び出してcommandで指定されたコマンドを実行し、コマンド/bin/sh -c commandが完了した後に戻ります

一方:

このpopen()関数は、パイプを作成し、分岐し、シェルを呼び出すことによってプロセスを開きます。

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


わかりました。それでは、Windows環境でos.systemとpopenの両方を実行できる方法はありますか?私は...初心者と深く掘るために必要だ
Arovit

はい、Windows環境ではos.systemとサブプロセスの両方を使用できます。effbot.org(Python標準ライブラリのオンラインブック)からの基本的なチュートリアルをご覧ください
Senthil Kumaran

注意-古いシステムで実行している場合、サブプロセスモジュールは使用できません。
Steve Hanov、2011年

21

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

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

2

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

逆に、PopenはWindows ではCreateProcessを、posixベースのオペレーティングシステムでは_posixsubprocess.fork_execを使用する必要があります。

とはいえ、重要なアドバイスはos.systemのドキュメントにあります。

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

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