当我从Windows命令提示符运行python脚本时,它可以正常运行,但是当从Ubuntu运行时,抛出错误,提示“ JSON对象必须为str,而不是'bytes'”。 / p>
在调用函数“ print_out ”时,为什么相同的输入(来自RabbitMQ API调用的结果)被不同地对待是很令人困惑的。
下面是python脚本的代码段:-
import urllib.request, urllib.error, urllib.parse, requests
import json, optparse
class http_worker:
def authentication(self, url, user, pw):
password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, url, user, pw)
self.auth = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(self.auth)
urllib2.install_opener(opener)
def call_url(self, url, body_raw):
body = json.dumps(body_raw)
#
# urllib2 post since there is body
#
req = urllib2.Request(url, body, {'Content-Type': 'application/json'})
return urllib2.urlopen(req)
# THIS FUNCTION CALL IS THROWING ERROR
def print_out(my_json):
for item in my_json:
out = []
for _, val in sorted(item.get("properties").get("headers").items()):
out.append(str(val))
print(", ".join(out))
user = "guest"
pwd = "guest"
rabbit_host = "http://localhost:15672"
host_suffix = "/api/queues/%%2F/%s/get" %(rabbit_queue_name)
url = rabbit_host + host_suffix
body_raw = {"count":5000,"ackmode":"ack_requeue_false", "encoding":"auto","truncate":50000}
worker = http_worker()
worker.authentication(url, user, pwd)
res = worker.call_url(url, body_raw)
#result = json.loads(res.read())
print_out(json.loads(res.read()))
答案 0 :(得分:1)
因此,这是特定于python版本的错误,与环境无关。为了执行脚本,我使用的是python.exe(将我带到python3),而不是Windows上Ubuntu上Bash中的python。查尔斯·达菲(Charles Duffy)指出了这一点:-
坦率地说,str-vs-bytes的区别完全不是特定于JSON的。很可能您在两个环境中有两个不同的Python版本(一个python2,另一个python3 f / e)。 –查尔斯·达菲