Подтвердить что ты не робот

Подпроцесс python 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)

первая работа хорошо, но второе возвращение:

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 является новым пакетом? Как решить эту проблему?

4b9b3361

Ответ 1

Команда 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))

Ответ 2

Слово 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 для запуска команд из вашего вопроса.