質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

意見交換

6回答

290閲覧

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

khaii21

総合スコア66

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

1クリップ

投稿2024/04/27 05:59

実現したいこと

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])
tatsu99👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

回答6

#1

TakaiY

総合スコア12792

投稿2024/04/27 06:56

Popen.communicate()はstringもしくはbytesのタプルを返すとあります。

https://docs.python.org/ja/3.6/library/subprocess.html#subprocess.Popen.communicate

エラーに出ている b'' はバイト列であることを示しますので、文字列として扱いたいのであれば、その文字列のエンコードを指定してdecode()する必要があります。

https://docs.python.org/ja/3/library/stdtypes.html#bytes.decode

utf-8なら

python

1Popen(auth_get, shell=True, stdout=PIPE, stderr=PIPE)).communicate()[0].decode('utf-8')

python2では、バイト列と文字列に区別がありませんが、python3では区別するというところが違いになります。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#2

bsdfan

総合スコア4587

投稿2024/04/27 08:08

エラーについては#1 に書かれている通りですが、別の方法として、 json で返ってきているなら ast.literal_eval() を使うよりも json.loads() を使うほうが素直なやり方だと思います。
json.loads なら bytes でもできるかと。
(https://docs.python.org/ja/3/library/json.html#json.loads)

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#3

khaii21

総合スコア66

投稿2024/04/27 09:33

#1 TakaiYさん
ご確認ありがとうございます。
ご教授頂きました方法で問題無く動くようになりました。
大変助かりました。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#4

khaii21

総合スコア66

投稿2024/04/27 09:53

#2 bsdfanさん
json.loads()のやり方もご教授頂き、とても勉強になりました。
本当にありがとうございました。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#5

TakaiY

総合スコア12792

投稿2024/04/28 01:57

コメント欄がないのでここに書きますが、プログラミングの疑問点の質問なので、これは意見交換でなくQ&Aにしたほうがよかったでしょう。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#6

khaii21

総合スコア66

投稿2024/04/28 03:56

#5 TakaiYさん
すみません。ご指摘の通りです。
久しぶりにteratailに訪れたところ、UIが刷新されていてQ&Aに投稿したつもりでしたが
意見交換に投稿してしまいました。
重ね重ね申し訳ございませんでした。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

この意見交換はまだ受付中です。

会員登録して回答してみよう

アカウントをお持ちの方は

関連した質問