2016-06-29 4 views
3

正直言って、ヘルプページで何が起こっているのか、それが意味するもの(それは定義されていないもの)を実際に解釈するためには、「非ゼロ」状態の用語を理解できません。check_call check_outputコールとサブプロセスモジュールのPopenメソッドの実際的な違いは何ですか?

subprocess.call subprocess.check_output subprocess.popen

のこれらのプロセスは本当に異なっている他のスクリプトを呼び出すためのpythonを使用してのいくつかの例は何ですか? これらのいずれかを使用するのはいつですか?また、これらの方法の明確な詳細はなんですか?単純なOSコールが必要な場合は、代わりにos.systemを使用する必要がありますか?

+0

次の投稿は、あなたの質問に部分的に答えています。 http://stackoverflow.com/questions/7681715/whats-the-difference- between-subprocess-popen-and-call-how-can-i-use-them – bergercookie

答えて

3

主な違いは、popenは(あなたがフィニッシュへの呼び出しを待つことなく、プログラムの実行を続けることができるという意味)非ブロック機能である一方で、ということで、callcheck_outputの両方がを遮断あります。

他の違いは、彼らが返すものの中にある:

方法callcheck_outputは、実際には、Popen objectを使用して、popenラッパーを遮断しています。 たとえば、Popen.returncode()を呼び出してreturncode属性を取得できます。

4

@ otorrillasの回答をいくつかの例で展開します。

成功しているかどうかを気にするだけの短いスクリプトがあるとしたら、今すぐ実行して結果を待っているとします。たとえば、単一のpingをリモートマシンに送信したいとします。

res = call(['ping', '127.0.0.1', '-c', '1', '-W', '1']) 
# res is 0 if the ping succeeded, non-zero if it failed. 

は今、あなたはあなたが仮定したいコマンドが成功するために起こっている、とあなたが何かのために使用するいくつかの出力を与えるために起こっている持っていることを言う:callはあなたのためのものです。 check_callはあなたのためです。おそらく、Subversionのコマンド:一般的に

svn_output = check_call(['svn', 'info', path_to_my_working_copy]) 
# svn_output now contains the svn info output. If it failed, an 
# exception is thrown which more easily allows you to give 
# responsibility of that failure to whoever passed us the wrong 
# path_to_my_working_copy. 

、ご利用の場合は、単にそれらのカテゴリの1に該当しない場合、あなたはおそらくPopenを使用して巻くしようとしています。

単純なユースケースの1つは、起動したいデーモンプロセスがあるとしますが、それからあなたのPythonプロセスと一緒に実行することができます。今、あなたはPopenを使用します。

my_proc = Popen(['my-daemon']) 

# We're going to go and do something else now, but want to make sure 
# my_proc dies when we do. 
import atexit 
atexit.register(my_proc.kill) 

NB:あなたは生のPopenを使用する場合は、あなたは私が示されているようあなたはおそらくatexitを使用して、プロセスを終了を確認する必要があります。

*「非ゼロ」の終了ステータスはプロセスが失敗したことを意味します。Tolstoyに帰属する有名なコンピュータサイエンスの引用は、 "ハッピープロセスはすべて似ています;すべての不幸なプロセスはそれ自身の方法で不幸です"つまり、プロセスが幸せになる方法は1つだけです:0を返すこと。不幸になる方法はたくさんあります。

関連する問題