Как сохранить выходные данные команд Azure-cli в переменной - PullRequest
0 голосов
/ 15 сентября 2018

При использовании azure-cli в python 3.5 и вызове команд из скрипта я не могу контролировать вывод в консоли.

Когда команда выполняется, она выводит результат на консоль, но я пытаюсь просто взять результат и поместить его в переменную для анализа.

from azure.cli.core import get_default_cli

class AzureCmd():
        def __init__(self, username, password):
            self.username = username
            self.password = password

        def login(self, tenant):
            login_successfull = get_default_cli().invoke(['login',
                                                          '--tenant', tenant,
                                                          '--username', self.username,
                                                          '--password', self.password]) == 0
            return login_successfull

        def list_vm(self, tenant):
            list_vm = get_default_cli().invoke(['vm', 'list', '--output', 'json'])
            print(list_vm)


    tenant = 'mytenant.onmicrosoft.com'
    cmd = AzureCmd('login', 'mypassword')
    cmd.login(tenant)
    cmd.list_vm(tenant)

Вот моя попытка сценария.

Чего я хочу добиться: не получать никакого вывода при выполнении cmd.login (tenant). Вместо получения 0 (успех) или 1 (сбой) в моих переменных login_successfull и list_vm, я хочу сохранить в нем выходные данные get_default_cli (). Invoke ().

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Я столкнулся с той же проблемой и нашел решение, я также обнаружил, что многие люди предложили стандартное решение, которое обычно работает в большинстве случаев, но они не убедились, что оно работает для этого сценария, и выясняется, чтоэто крайний случай.
Я думаю, что проблема имеет какое-то отношение к az cli, основанному на python.

Win10CommandPrompt:\> where az C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\az.cmd

Если вы посмотрите в этот файл, то увидите что-то вроде этого и обнаружите, что Azure CLI - это просто python:

python.exe -IBm azure.cli

Так что делатьВы хотите сделать, попробуйте это (это работает для меня):

import subprocess
out = subprocess.run(['python', '-IBm', 'azure.cli', '-h'], stdout=subprocess.PIPE).stdout.decode('utf-8')
print(out) 
#this is equivalent to "az -h'

Приведенный выше синтаксис не будет работать, если каждый аргумент не является списком строк, разделенных запятыми, я нашел синтаксис Iкак много после прочтения, как сделать несколько аргументов с помощью python popen:

import subprocess
azcmd = "az ad sp create-for-rbac --name " + SPName + " --scopes /subscriptions/" + subscriptionid
out = subprocess.run(azcmd, shell=True, stdout=subprocess.PIPE).stdout.decode('utf-8')
print(out)
0 голосов
/ 18 октября 2018

Я думаю, вы можете использовать подпроцесс и вызвать az cli, чтобы получить вывод, вместо этого используя get_default_cli.

import subprocess
import json

process = subprocess.Popen(['az','network', 'ddos-protection', 'list'], stdout=subprocess.PIPE)
out, err = process.communicate()
d = json.loads(out)
print(d)
...