Subprocess.check_output失败,退出状态为4,该命令手动运行

时间:2019-05-15 16:45:18

标签: python python-3.x subprocess

我正在尝试使用cfn-lint python模块验证CloudFormation模板。我有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,我收到此错误:

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文件中运行这些命令以简化重复性是理想的。大部分内容对我来说都是新手,所以如果有更好的方法可以进行此操作,请告诉我。

编辑 这两个命令不起作用的原因是由于check_output期望有True退出代码并收到了False退出代码。我通过在打印输出之前添加try / except来解决此问题:

try:
    result = subprocess.check_output(cmd, shell=True).decode("utf-8")
except subprocess.CalledProcessError as e:
    result = e.output.decode("utf-8")

0 个答案:

没有答案