Сбой Subprocess.check_output со статусом выхода 4 для команды, которая работает вручную - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь проверить шаблоны CloudFormation с помощью модуля Python cfn-lint.У меня есть 3 шаблона для проверки, и я хочу использовать подпроцесс для запуска этих команд.Тем не менее, я могу только заставить subprocess.check_output () работать для одного из шаблонов - два других возвращают CalledProcessError.

Я проверил, что команды будут работать, если они запускаются вручную.Я удалил вызов subprocess.check_output () из моего цикла и все еще получил ту же ошибку.Я выполняю каждый звонок отдельно, без удачи.

Я использую Python 3.7.3

Вот мой код:

import cfnlint.core
import subprocess
from colorama import init, Fore

init()

cmd1 = r'cfn-lint templates\iam\StreamRoles.yaml'
cmd2 = r'cfn-lint templates\TechStack.json'
cmd3 = 'cfn-lint serverless.yml'

def run_command(cmd):
    result = subprocess.check_output(cmd, shell=True).decode("utf-8")
    if len(result) == 0:
        print(Fore.GREEN + 'Template: ' + cmd[9:] + ' looks okay')
    else:
        print(Fore.RED + result)

run_command(cmd1) #works as expected
run_command(cmd2) #returns error
run_command(cmd3) #returns error

Для TechStack.json Iполучил эту ошибку:

subprocess.CalledProcessError: Command 'cfn-lint templates\TechStack.json' returned non-zero exit status 4.

Для serverless.yml я получил эту ошибку:

subprocess.CalledProcessError: Command 'cfn-lint serverless.yml' returned non-zero exit status 2.

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

EDIT Причина, по которой эти две команды не работали, была вызвана check_output ожидание True кода выхода и получение False кода выхода.Я решил эту проблему, добавив попытку / исключение, прежде чем напечатать вывод:

try:
    result = subprocess.check_output(cmd, shell=True).decode("utf-8")
except subprocess.CalledProcessError as e:
    result = e.output.decode("utf-8")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...