我正在尝试使用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")