首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用python运行Azure CLI命令?

如何使用python运行Azure CLI命令?
EN

Stack Overflow用户
提问于 2018-07-27 03:15:40
回答 7查看 21.8K关注 0票数 13

我要使用Azure CLI获取我的资源组中所有VM的列表。但是我想使用python脚本来实现相同的功能。

例如,我将在Azure CLI中使用以下命令列出我的资源组中的VM:

“az vm list -g MyResourceGroup”

但是,我想让python脚本做同样的事情,我只需要在python程序中包含CLI命令。

EN

回答 7

Stack Overflow用户

发布于 2019-05-03 05:51:38

在过去的几天里,我一直在实现这一点。@cbehrenberg提供的方法主要是我使用的方法,但我发现您可以在不使用临时文件的情况下做到这一点。取而代之的是直接从azure客户端捕获输出。我想这可能会有用。

代码语言:javascript
运行
复制
from azure.cli.core import get_default_cli

def az_cli (args_str):
    args = args_str.split()
    cli = get_default_cli()
    cli.invoke(args)
    if cli.result.result:
        return cli.result.result
    elif cli.result.error:
        raise cli.result.error
    return True

然后以相同的方式调用:

代码语言:javascript
运行
复制
from azhelper import az_cli

response = az_cli("vm list")
print("vm's: %s" % (response))
票数 18
EN

Stack Overflow用户

发布于 2018-07-27 13:32:01

如何使用python运行Azure CLI命令?

根据这个file。我们可以通过以下方式调用Azure CLI:

代码语言:javascript
运行
复制
from azure.cli.core import get_default_cli
get_default_cli().invoke(['vm', 'list', '-g', 'groupname'])

注意:如果出现No module named 'azure.cli.command_modules'错误,请安装azure-cli

票数 9
EN

Stack Overflow用户

发布于 2018-10-22 02:29:19

使用子进程解决方案是有问题的,因为子进程不检查Azure CLI所在的路径,例如在Windows上。使用"cmd“将是一个特定于-c的解决方案,并且需要一个分支if/else才能获得额外的Linux支持。

@tom-sun的答案几乎是正确的,因为您可以重用Azure CLI Python模块,因为CLI也是用python编写的。问题是,.invoke()指令的返回总是返回错误代码。要获得完整的正文响应,必须在基础技巧代码的参数列表上传递一个类似object的文件来获得响应。默认情况下,这会重定向到StdOut,这就是为什么你可以在终端中看到它,但如果成功,你总是得到一个零。

我写了一个小的助手函数,它接受一个字符串中的Azure CLI指令(我不喜欢很多参数作为列表,它读起来不好-但这只是个人喜好,不要怪我)。它使用一个临时文件作为输出目标,然后将其读回内存中-这是底层Knack CLI代码中所需的;默认情况下,StdOut是标准管道。

它要求您为Python安装azure-cli:pip install azure-cli

文件azhelper.py

代码语言:javascript
运行
复制
from azure.cli.core import get_default_cli
import tempfile

def az_cli (args_str):
    temp = tempfile.TemporaryFile()
    args = args_str.split()
    code = get_default_cli().invoke(args, None, temp)
    temp.seek(0)
    data = temp.read().strip()
    temp.close()
    return [code, data]

然后,您可以像这样调用:

代码语言:javascript
运行
复制
from azhelper import *

code, response = az_cli("vm list")
print("vm's: %s" % (response))

当然,您需要登录,请参阅@4c74356b41答案。

如果有人找到更好的方法来处理响应,而不是使用临时文件,这将是非常感谢的!我尝试了一个内存中的StringIO对象,但不知何故这不符合底层的技巧CLI代码。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51546073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档