2

Python には、失敗する可能性のあるサブプロセスを呼び出すための便利な関数が 2 つ用意されていsubprocess.check_callますsubprocess.check_output。基本的、

subprocess.check_call(['command', 'arg1', ...])

指定されたコマンドをサブプロセスとして生成し、ブロックして、サブプロセスが正常に終了したことを確認します(0 が返されます)。そうでない場合は、例外をスローします。check_outputサブプロセスの stdout をキャプチャしてバイト文字列として返すことを除いて、同じことを行います。

これは単一の Python 式であるため (数行のコードでサブプロセスを設定および制御する必要がない)、戻り値のチェックを忘れるリスクがないため便利です。

check_callとに相当する慣用的な Ruby は何check_outputですか? プロセスの戻り値を与えるグローバルは知って$?いますが、それは扱いにくいでしょう。例外があることのポイントは、手動でエラー コードをチェックする必要がないことです。Rubyでサブプロセスを生成する方法は多数ありますが、この機能を提供する方法はありません。

4

3 に答える 3

0

基本/組み込みのメソッドは、POpen4 gem に取って代わられました。そして、shell-executor gem はさらに素晴らしいものを提供します。

于 2013-05-21T20:41:00.283 に答える
0

Ruby で最も慣用的なソリューションを言うのは難しいですが、Python に最も近いソリューションはShell.execute!おそらくshell-executer.

ドキュメントページの例から:

begin
  Shell.execute!('ls /not_existing')
rescue RuntimeError => e
  print e.message
end

比較:

try:
    subprocess.check_call('ls /not_existing', shell=True)
except Exception as e:
    print e.message

ここでの最も顕著な違いは、Ruby の同等物にはshell=False(そして引数をリストとして受け取る) 方法がないことです。これは、Python にあるだけでなく、デフォルトで行われます。

また、Python のe.message場合はデフォルト メッセージまたは戻りコードに基づいて生成されるものになり、Ruby のe.message場合は子の になりstderrます。

したい場合はshell=False、私の知る限り、より低いレベルの周りに独自のラッパーを作成する必要があります。私が知っているすべての Ruby ラッパー ( shell-executerPopen4、 [ open4][4]) は、POSIXpopen関数のラッパーまたはエミュレーターです。

于 2013-05-21T20:42:35.347 に答える