web-dev-qa-db-ja.com

サブプロセスcheck_outputがゼロ以外の終了ステータス1を返しました

これは私のpythonコードです:

import subprocess
subprocess.check_output("ls",Shell=True,stderr=subprocess.STDOUT)

import subprocess
subprocess.check_output("yum",Shell=True,stderr=subprocess.STDOUT)

最初の.check_output()はうまく機能しますが、2番目はこれを返します:

Traceback (most recent call last):
File "/usr/lib/x86_64-linux-gnu/gedit/plugins/pythonconsole/console.py", line 378, in __run
r = eval(command, self.namespace, self.namespace)
File "<string>", line 1, in <module>
File "/usr/lib/python3.4/subprocess.py", line 616, in check_output
raise CalledProcessError(retcode, process.args, output=output)
subprocess.CalledProcessError: Command 'yum' returned non-zero exit status 1

なぜこれが起こるのですか? lsは元のシェルコマンドですが、yumは新しいパッケージであるためですか?この問題を解決するにはどうすればよいですか?

42
Zongze Wu

起動したコマンドyumは正しく実行されました。コマンドの処理中にエラーが発生したことを意味するゼロ以外のステータスを返します。おそらく、それを修正するためにyumコマンドに引数を追加する必要があります。

コードはこのエラーを次のように表示する可能性があります。

import subprocess
try:
    subprocess.check_output("dir /f",Shell=True,stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
39
Plouff

名前のcheck_という単語は、コマンド(最後のコマンドの終了ステータス(この場合はyum)を返すこの場合のシェル)がゼロ以外のステータスを返す場合、CalledProcessError例外が発生することを意味します。これは仕様です。実行するコマンドが成功時にゼロ以外のステータスを返す場合、この例外をキャッチするか、check_メソッドを使用しないでください。キャプチャされた出力を無視しているため、ケースでsubprocess.callを使用できます。例:

import subprocess

rc = subprocess.call(['grep', 'pattern', 'file'],
                     stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
if rc == 0: # found
   ...
Elif rc == 1: # not found
   ...
Elif rc > 1: # error
   ...

質問からコマンドを実行するのにShell=Trueは必要ありません。

10
jfs