check_output не работает в Python 3.6, в то время как подпроцесс работает нормально - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь получить вывод команды в моей программе на Python, используя метод "check_output".но я получаю эту ошибку:

   out = check_output(command5 , shell=True)

Файл "/usr/lib64/python3.6/subprocess.py", строка 336, в файле check_output ** kwargs). Файл ststout "/usr/lib64/python3.6/subprocess.py", строка 418, в прогоне output = stdout, stderr = stderr) subprocess.CalledProcessError: Command 'oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_rht-ccp --results-arf arf.xml / usr / share / xml / scap/ssg/content/ssg-centos7-ds.xml 'вернул ненулевой статус выхода 2.

это часть моей программы, которая связана:

command4 = "oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_rht-ccp --results-arf arf.xml /usr/share/xml/scap/ssg/content/ssg-centos7-ds.xml"
out = check_output(command4 , shell=True)

Я уверенчто команда в порядке, потому что я получаю результаты, когда пишу:

subprocess.call(command5,shell=True)

Я использую Python 3.6, и работаю в Centos 7.

Любая идея, почему check_output не можетполучить результат?

1 Ответ

0 голосов
/ 12 октября 2018

Это совершенно нормально , потому что команда, которую вы запустили, выдает ненулевой код завершения.Это означает, что команда, которую вы выполнили, сигнализирует о том, что что-то может быть не так.

См. Документацию subprocess.check_output() :

Если код возврата отличен от нуля, возникает ошибка CalledProcessError.

и

Это эквивалентно:

run(..., check=True, stdout=PIPE).stdout

, где флаг check=True указывает run() вызвать исключение, когда return_value не 0:

Если проверка верна и процесс завершается с ненулевым кодом выхода, будет сгенерировано исключение CalledProcessError.

Другая функция, которую вы использовали, subprocess.call(), не устанавливает check=True:

Запустите команду, описанную args.Дождитесь завершения команды, затем верните атрибут returncode.

Это эквивалентно:

run(...).returncode

Так что либо не use check_output(), либо перехватите сгенерированное исключение, либо исправьте команду, которую вы выполняете.То, что call() сработало, не означает, что процесс действительно дал успешный результат.

Например, вы можете использовать subprocess.run() напрямую:

proc = subprocess.run(
    command5, shell=True, text=True
    stdout=subprocess.PIPE, stderr=subprococess.PIPE)
if proc.returncode:
    print(f'Issue reported, exit code {proc.returncode}, stderr:')
    print(proc.stderr)
else:
   print(proc.stdout)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...