Python3 subprocessモジュールのPopenメソッドを使ったコマンド結果の取得値がPython3系ではエラーになる

実現したいこと

ZabbixサーバからAdminユーザーの認証用トークンを取得したい

前提

内部でcurlコマンドを実行してZabbixサーバのAPI経由で認証用のトークンを取得します。
Python 2.7系の環境では正常に認証用のトークン(変数auth)が取得出来ていましたが、
Python 3系の環境ではエラーとなります。
エラー内容の最終行にそれらしき値は取得出来ているように見受けられますが
エラーが解消出来ません。
b' の意味がよく分かっていません。

ValueError: malformed node or string: b'{"jsonrpc":"2.0","result":"928h31cowjfnlp8c4b434c","id":1}'

何かお気づきの事がありましたらご教授頂けないでしょうか。
宜しくお願い致します。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "/usr/local/bin/zabbix_admin_auth.py", line ??, in <module> admin_auth = literal_eval((Popen(auth_get, shell=True, stdout=PIPE, stderr=PIPE)).communicate()[0]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib64/python3.11/ast.py", line 110, in literal_eval return _convert(node_or_string) ^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib64/python3.11/ast.py", line 109, in _convert return _convert_signed_num(node) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib64/python3.11/ast.py", line 83, in _convert_signed_num return _convert_num(node) ^^^^^^^^^^^^^^^^^^ File "/usr/lib64/python3.11/ast.py", line 74, in _convert_num _raise_malformed_node(node) File "/usr/lib64/python3.11/ast.py", line 71, in _raise_malformed_node raise ValueError(msg + f': {node!r}') ValueError: malformed node or string: b'{"jsonrpc":"2.0","result":"928h31cowjfnlp8c4b434c","id":1}'

該当のソースコード

zabbix_admin_auth.py

1import sys 2import getpass 3import ast 4from ast import literal_eval 5from subprocess import PIPE, Popen 6import subprocess 7 8 9# Adminユーザーの情報取得用コマンド 10auth_get = "curl -s -d ' \ 11{ \ 12 \"auth\": null, \ 13 \"method\": \"user.login\", \ 14 \"id\": 1, \ 15 \"params\": { \ 16 \"password\": \"xxxxx", \ 17 \"user\": \"Admin\" \ 18 }, \ 19 \"jsonrpc\": \"2.0\" \ 20} \ 21' -H \"Content-Type: application/json-rpc\" http://zabbix.server.co.jp/zabbix/api_jsonrpc.php" 22 23 24# Adminユーザーの情報をZabbixサーバから取得してJSON形式に変換 25admin_auth = literal_eval((Popen(auth_get, shell=True, stdout=PIPE, stderr=PIPE)).communicate()[0]) 26 27# Adminユーザーのauthを取得 28auth = admin_auth['result']

試したこと

25行目のPopenメソッドを下記2つに変更してみましたが、同エラーとなり解消出来ませんでした。

① admin_information = ast.literal_eval((Popen(auth_get, shell=True, stdout=PIPE, stderr=PIPE)).communicate()[0]) ② admin_information = literal_eval((subprocess.Popen(auth_get, shell=True, stdout=PIPE, stderr=PIPE)).communicate()[0])

コメントを投稿

0 コメント