簡體   English   中英

python subprocess.check_output() ubuntu容器中json參數解析

[英]python subprocess.check_output() json parameter parsing in ubuntu container

嘗試在 ubuntu 20.04 容器中使用 subprocess.check_output() 執行代碼:

try:
    out = subprocess.check_output(exe)
except subprocess.CalledProcessError as e:
    log.error(f"unable to execute:{' '.join(exe)} -> {e} -> {out}")
    return None
0211022170027|INFO|command used: ./bin/elkq.py --env=test --vertical=trk --index='bps-trace-*'
 --testenv=test12 --fields=@timestamp,message,bps.application --aggs=bps.application --start=now-4h
 --end=now --json --fany='("error")' --fmust='[{"fields.buypass.com/name": "id-pro-_VERT_-*"},
 {"bps.application": "*-_TESTENV_"}]'
20211022170028|ERROR|unable to execute:./bin/elkq.py --env=test --vertical=trk --index='bps-trace-*'
 --testenv=test12 --fields=@timestamp,message,bps.application --aggs=bps.application --start=now-4h
 --end=now --json --fany='("error")' --fmust='[{"fields.buypass.com/name": "id-pro-_VERT_-*"},
 {"bps.application": "*-_TESTENV_"}]' ->
 Command '['./bin/elkq.py', '--env=test', '--vertical=trk', "--index='bps-trace-*'",
 '--testenv=test12', '--fields=@timestamp,message,bps.application', '--aggs=bps.application',
 '--start=now-4h', '--end=now', '--json', '--fany=\'("error")\'',
 '--fmust=\'[{"fields.buypass.com/name": "id-pro-_VERT_-*"}, {"bps.application": "*-_TESTENV_"}]\'']'
 returned non-zero exit status 255. -> None

但是如果我直接從上面的命令 use 行剪切並粘貼命令在同一個容器中它工作正常,所以我假設錯誤在子進程環境中:

(base) root@deabf77921e8:/ # ./bin/elkq.py --env=test --vertical=trk --index='bps-trace-*' \
 --testenv=test12 --fields=@timestamp,message,bps.application --aggs=bps.application --start=now-4h \
 --end=now --json --fany='("error")' \
 --fmust='[{"fields.buypass.com/name": "id-pro-_VERT_-*"}, {"bps.application": "*-_TESTENV_"}]'
{
  "aggregations": {
    "bps.application": {
      "buckets": [
        {
          "doc_count": 15,
          "key": "id-pro-trk-trk-scim-api-test12"
        },
        {
          "doc_count": 1,
          "key": "id-pro-trk-trk-freg-gateway-test12"
        },
        {
          "doc_count": 1,
          "key": "id-pro-trk-trk-id-proofing-web-test12"
        }
      ],
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0
    }
  },
  "count": "max count found:17 rows in 0.05 sec"
}
(base) root@deabf77921e8:/ # echo $?
0

我知道它與 --fmust 參數有關,因為如果我忽略它,它會起作用,而且我之前通過 argparse 使用默認參數解決了它:

r'[{"fields.buypass.com/name": "id-pro-_VERT_-*"}, {"bps.application": "*-_TESTENV_"}]'

在 powershell 中,它只需雙引號"""但 CI 運行 linux 容器。

非常感謝有關調試的任何幫助,謝謝

我將 subprocess.check_output() 更改為在 linux 上使用shell=True ,這可能是一個骯臟的解決方法,但現在它可以在帶有 json 參數的 powershell 和 bash 中使用:

shell = True
if sys.platform != 'win32':
   exe = ' '.join(exe)
   shell = False
try:
    out = subprocess.check_output(exe, shell=shell)
except subprocess.CalledProcessError as e:
    log.error(f"unable to execute:{exe} -> {e} -> {out}")
    return None

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM