当前位置: 首页 > 知识库问答 >
问题:

Json字符串解析在运行MSDOS时工作,但在Windows上的Ubuntu上的Bash中不工作[复制]

冷夜洛
2023-03-14

当我在Windows命令提示符下运行python脚本时,它工作得非常好,但当它在Ubuntu上运行时,会抛出错误,即“JSON对象必须是str,而不是‘bytes’”。

为什么在调用函数“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()))

共有1个答案

谭志用
2023-03-14

所以,这是python版本特定的错误,与环境无关。为了执行我的脚本,我使用python。exe(它让我进入python3),而不是Windows上Ubuntu上Bash中的python。正如查尔斯·达菲指出的那样,这要归功于他:-

坦率地说,str与bytes的区别根本不是JSON特有的。同样可能的是,在您的两个环境中有两个不同的Python版本(一个是python2,另一个是python3 f/e)查尔斯·达菲

 类似资料: