Python调用Azure CLI执行backup命令提示VMNAME未识别如何解决
问题根源
你遇到的报错由三个核心问题导致:
- 你定义的
query变量完全没有传入subprocess.Popen的参数列表,相当于执行az命令时根本没加--query参数,自然无法识别VMNAME相关逻辑 - az命令少了
list子命令,和终端执行的完整命令结构不一致 - 没有显式指定az命令的输出格式为json,命令报错时输出的纯文本内容无法被json解析器处理,就会触发
JSONDecodeError - 字符串转义冗余:用列表形式传参给subprocess时,query里的单引号不需要加反斜杠转义,直接写即可。
修复后的完整代码
from azure.cli.core import get_default_cli import subprocess import json #VARS AZCLIusr="CREDENTIALS" AZCLIpwd="CREDENTIALS" AZCLItenant="CREDENTIALS" ####### print("#### LOGIN AZ #####") get_default_cli().invoke(['login', '--service-principal', '--username', str(AZCLIusr), '-p', str(AZCLIpwd), '--tenant', str(AZCLItenant)]) print ("### VM LIST COMMAND #####") ##VARS## rgAZ="RESOURCEGROUPNAME" startDate="30-08-2021" # 单引号不需要额外转义 query="[?contains(properties.containerName, 'VMNAME')].properties.status" #### # 补全list子命令、添加query参数、显式指定json输出格式 process = subprocess.Popen([ 'az','backup', 'job', 'list', '--resource-group', rgAZ, '--start-date', startDate, '--vault-name', 'myRecoveryServicesVault', '--query', query, '-o', 'json' ], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = process.communicate() # 先判断命令执行状态再解析,避免异常崩溃 if process.returncode == 0: jsonLoads = json.loads(out) print("### PRINT JSON FORMAT #####") print(json.dumps(jsonLoads, indent=4, sort_keys=True)) print("### PRINT STRING FORMAT #####") print(jsonLoads) else: print("命令执行错误,错误信息:", err.decode('utf-8'))
内容的提问来源于stack exchange,提问作者RCat
相关产品推荐
相关产品推荐

