【问题标题】:Google cloud - Python automation谷歌云 - Python 自动化
【发布时间】:2021-09-11 16:12:37
【问题描述】:

我想知道如何管理可以作为 Python 脚本中嵌入的 gcloud 命令输出的数据。例如,我用 Python 编写了简单的脚本。我正在从 Google Cloud Shell Editor 执行它。代码如下:

import subprocess

project = "gcloud info --format='value(config.project)'"
subprocess.call(project, shell=True)
subprocess.run(["gcloud config set project projectID"], shell=True)
result = subprocess.run(["gcloud compute instances os-inventory list-instances"], shell=True)
print(result)

作为终端的输出,我可以看到虚拟机列表。我想只过滤掉具有特定属性、名称或 IP 号的虚拟机。我该如何管理这些输出,该变量result 的类是<class 'subprocess.CompletedProcess'>

脚本输出如下:

NAME           ZONE            MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP      STATUS
server00       europe-west2-c  e2-medium                  10.x.x.x     x.x.x.x           RUNNING
server01       europe-west2-c  e2-medium                  10.x.x.x     x.x.x.x           RUNNING

【问题讨论】:

    标签: python google-cloud-platform gcloud google-api-python-client


    【解决方案1】:

    尝试使用result.stdout

    您可能还需要将capture_output=True 添加到 subprocess.run 调用中。这样做:

    subprocess.run(["gcloud config set project projectID"], capture_output=True, text=True, shell=True)
    

    这将为您提供标准输出文本,然后您可以将其拆分为换行符、迭代创建的数组、过滤您需要的任何内容等。

    对于过滤,您可以在子进程命令上进行,也可以在后处理中进行。因此,例如,如果您只想查看位于 us-central1 区域中的结果虚拟机,您可以将子进程命令更改为:

    ["gcloud config set project projectID"]

    ["gcloud config set project projectID | grep us-central1"]

    或者,您可以进行后期处理:

    
    project = "gcloud info --format='value(config.project)'"
    subprocess.call(project, shell=True)
    subprocess.run(["gcloud config set project projectID"], shell=True)
    result = subprocess.run(["gcloud compute instances os-inventory list-instances"], shell=True)
    
    arr = result.stdout.split("\n")
    for line in arr:
      if "us-central1" in line:
        print(line)
    

    【讨论】:

    • 我修改了代码p = subprocess.run(["gcloud compute instances os-inventory list-instances --format json"], capture_output=True, text=True, shell=True) result = p.stdout print(result),但是如何解析那个json输出呢?
    • 编辑了我的答案以更具体地说明您将如何做到这一点。
    • 嗨,谢谢,这很好,但是如何进入 json 结构,例如如何获取值,例如:print(result['name']) 以获取具有 json 键名的所有值:name .我宁愿解析 json 文件。
    • 如果您添加了--format=json,您应该拥有它,但从上面评论中的代码来看,它可能位于错误的位置。它应该在 gcloud 命令之后,而不是在组之后......所以像这样:["gcloud --format=json compute instances os-inventory list-instances"]
    【解决方案2】:

    您能否编辑问题并显示示例输出,以便在不设置 gcloud 的情况下更轻松地做出答案。

    因为我不知道输出看起来如何,所以我无法给出关于如何过滤的确切答案。 但是,如果您想从“gcloud compute instances os-inventory list-instances”中获取输出,您可以这样做:

    import subprocess
    
    project = "gcloud info --format='value(config.project)'"
    subprocess.call(project, shell=True)
    subprocess.run(["gcloud config set project projectID"], shell=True)
    p = subprocess.Popen(["gcloud", "compute instances os-inventory list-instances"], stdout=subprocess.PIPE)
    out, err = p.communicate()
    
    print(out)
    

    【讨论】:

    • 我刚刚添加了可以在 Google 门户的终端中看到的输出。
    • 嗨,你的代码在我的环境中不起作用,我收到一个错误FileNotFoundError: [Errno 2] No such file or directory: 'gcloud ': 'gcloud '
    • 将 gcloud 更改为 gcloud 可执行文件的路径,它应该可以工作
    • 这是什么意思 - “gcloud 可执行文件”,我的 .py 文件所在的位置?
    • 没有你正在执行的应用程序“gcloud”的位置,如果你在linux上它可能在/usr/bin
    猜你喜欢
    • 2020-01-14
    • 2020-09-07
    • 1970-01-01
    • 2019-12-24
    • 2019-02-15
    • 2021-06-20
    • 1970-01-01
    • 2022-11-13
    • 2020-10-03
    相关资源
    最近更新 更多