【问题标题】:How to call jq written in shell with python subprocess?如何用python子进程调用用shell编写的jq?
【发布时间】:2020-08-25 15:14:11
【问题描述】:

我有以下两个 shell 脚本。

nodes.sh:

#!/bin/bash

NODE_IDs=$(docker node ls --format "{{.ID}}")
for NODE_ID in ${NODE_IDs}
do
    docker node inspect $NODE_ID | jq -r '.[] | {node:.ID, ip:.Status.Addr}'
done | jq -s

nodes.sh 给出以下输出(使用./nodes.sh 或cat ./nodes.sh | bash):

[
  {
    "node": "b2d9g6i9yp5uj5k25h1ehp26e",
    "ip": "192.168.1.123"
  },
  {
    "node": "iy25xmeln0ns7onzg4jaofiwo",
    "ip": "192.168.1.125"
  }
]

node_detail.sh:

#!/bin/bash

docker node inspect b2d | jq '.[] | {node: .ID, ip: .Status.Addr}'

node_detail.sh 给出的位置(./node_detail.sh 或 cat ./node_detail.sh):

{
  "node": "b2d9g6i9yp5uj5k25h1ehp26e",
  "ip": "192.168.1.123"
}

问题:我想从 python subporcess 运行这两个脚本。

我可以使用以下代码运行并获取 node_detail.sh 的输出:

>>> import subprocess
>>> proc = subprocess.Popen('./node_detail.sh', stdout=subprocess.PIPE, shell=True)
>>> proc.stdout.read()
'{\n  "node": "b2d9g6i9yp5uj5k25h1ehp26e",\n  "ip": "192.168.1.123"\n}\n'

我编写了以下代码来获取 nodes.sh

的输出
>>> import subprocess
>>> proc = subprocess.Popen('./nodes.sh', stdout=subprocess.PIPE, shell=True)

现在我收到以下错误:

>>> jq - commandline JSON processor [version 1.5-1-a5b5cbe]
Usage: jq [options] <jq filter> [file...]

    jq is a tool for processing JSON inputs, applying the
    given filter to its JSON text inputs and producing the
    filter's results as JSON on standard output.
    The simplest filter is ., which is the identity filter,
    copying jq's input to its output unmodified (except for
    formatting).
    For more advanced filters see the jq(1) manpage ("man jq")
    and/or https://stedolan.github.io/jq

    Some of the options include:
     -c     compact instead of pretty-printed output;
     -n     use `null` as the single input value;
     -e     set the exit status code based on the output;
     -s     read (slurp) all inputs into an array; apply filter to it;
     -r     output raw strings, not JSON texts;
     -R     read raw strings, not JSON texts;
     -C     colorize JSON;
     -M     monochrome (don't colorize JSON);
     -S     sort keys of objects on output;
     --tab  use tabs for indentation;
     --arg a v  set variable $a to value <v>;
     --argjson a v  set variable $a to JSON value <v>;
     --slurpfile a f    set variable $a to an array of JSON texts read from <f>;
    See the manpage for more options.
Error: writing output failed: Broken pipe
Error: writing output failed: Broken pipe

为什么我收到错误:写入输出失败:管道损坏?

【问题讨论】:

  • 对于这么简单的任务来说,这似乎太复杂了。不能直接使用Docker Python库吗?
  • @Paolo 我还没试过。

标签: python bash subprocess jq


【解决方案1】:

在nodes.sh中,不带任何参数调用jq,调用它为jq -s .。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-17
    • 2013-09-26
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 2015-06-01
    • 2012-06-04
    • 1970-01-01
    相关资源
    最近更新 更多