类型错误:无法将“bytearray”对象解释为整数。

3
我想通过HTTP发送音频数据,但我不明白为什么会出现这个异常:
Exception happened during processing of request from ('127.0.0.1', 59976)
Traceback (most recent call last):
  File "/usr/lib/python3.6/socketserver.py", line 654, in process_request_thread
    self.finish_request(request, client_address)
  File "/usr/lib/python3.6/socketserver.py", line 364, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python3.6/socketserver.py", line 724, in __init__
    self.handle()
  File "/usr/lib/python3.6/http/server.py", line 418, in handle
    self.handle_one_request()
  File "/usr/lib/python3.6/http/server.py", line 406, in handle_one_request
    method()
  File "/home/vivanov/temp.py", line 113, in do_GET
    data.append(bytearray(stream.read(CHUNK)))
TypeError: 'bytearray' object cannot be interpreted as an integer
问题似乎与向 wfile.write 传递值有关。如何解决这个问题?这是我的代码:
class ChunkingRequestHandler(BaseHTTPRequestHandler):
    ALWAYS_SEND_SOME = False
    ALLOW_GZIP = False
    protocol_version = 'HTTP/1.1'
    def do_GET(self):
        ae = self.headers.get('accept-encoding') or ''

        # send some headers
        self.send_response(200)
        self.send_header('Transfer-Encoding', 'chunked')
        self.send_header('Content-type', 'audio/x-wav')

        self.end_headers()

        data = bytearray(wav_header)
        data.append(bytearray(stream.read(CHUNK)))
        print(data)
        self.wfile.write(b"%X\r\n%s\r\n" % (len(data), data))

        while True:
            data = bytearray(stream.read(CHUNK))
            self.wfile.write(b"%X\r\n%s\r\n" % (len(data), data))

        # send the chunked trailer
        self.wfile.write('0\r\n\r\n')

2
请分享任何必要的代码和数据以重现问题。 - AMC
我刚刚将我的代码放在下面的单独帖子中,因为它是一个大片段。 - valioiv
你的错误消息包含一个堆栈跟踪。它会告诉你是什么触发了这个错误。如果你看一下,它并没有说调用wfile.write()触发了错误。相反,它说你将一个bytearray传递给了data.append(),这就是问题所在。bytearray的行为类似于列表,你可以在这里找到可以对列表和bytearray执行的普通操作。 - Dan Getz
@DanGetz,我已经添加了我拥有的代码。 - valioiv
2个回答

9

尽管名称为“append”,但如果您想将多个元素同时添加到Python中类似列表的对象中,则无法使用append方法。 bytearray就像是一组字节,因此将另一个bytearray追加或连接到其中的方法是使用extend方法或+=运算符:

data += bytearray(...)
#  OR
data.extend(bytearray(...))

事实上,如果你要添加到你的bytearray中的任何内容已经是可以传递到bytearray()构造函数中的内容,那么你很可能不需要将其包装在bytearray()中。例如,bytes对象(如b'something')可以直接添加:
data += b'something'

一旦你修复了代码中的那行,你可能会遇到其他行的问题。例如,如果wfile.write需要bytes类型的数据,那么向其发送 unicode 字符串,比如'0\r\n\r\n' 可能会出现错误;看起来你想要写成 b'0\r\n\r\n'


3

实际上,这是我最终使用的代码,可能对某些人有用:

class ChunkingRequestHandler(BaseHTTPRequestHandler):
    ALWAYS_SEND_SOME = False
    ALLOW_GZIP = False
    protocol_version = 'HTTP/1.1'
    def do_GET(self):
        ae = self.headers.get('accept-encoding') or ''

        # send some headers
        self.send_response(200)
        self.send_header('Content-type', 'audio/x-wav')

        self.end_headers()

        data = []
        for i in wav_header:
            data.append(int(i))
        for i in stream.read(CHUNK):
            data.append(int(i))
        self.wfile.write(bytearray(data))

        while True:
            data = []
            for i in stream.read(CHUNK):
                data.append(int(i))
            self.wfile.write(bytearray(data))

        # send the chunked trailer
        self.wfile.write('0\r\n\r\n')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接