首页 > 解决方案 > 在 Python 3.7 (macOS) 上运行扭曲的示例脚本会引发异常

问题描述

我正在尝试使用Python 3.7.5在macOS Catalina 10.15.1上运行扭曲的19.7.0

我选择聊天示例来验证它是否有效(请参阅https://twistedmatrix.com/documents/current/core/howto/servers.html中的源 chat.py )。

按照我twisted使用安装的文档virtualenv

我启动脚本,然后使用以下命令对其进行测试telnet

telnet 127.0.0.1 8123

它遵循堆栈跟踪:

Unhandled Error
Traceback (most recent call last):
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/python/log.py", line 86, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/python/context.py", line 122, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/python/context.py", line 85, in callWithContext
    return func(*args,**kw)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/internet/selectreactor.py", line 149, in _doReadOrWrite
    why = getattr(selectable, method)()
--- <exception caught here> ---
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/internet/tcp.py", line 1435, in doRead
    protocol.makeConnection(transport)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/internet/protocol.py", line 514, in makeConnection
    self.connectionMade()
  File "/Users/giacomo/pyenvs/twisted-samples/chat.py", line 13, in connectionMade
    self.sendLine("What's your name?")
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/protocols/basic.py", line 636, in sendLine
    return self.transport.write(line + self.delimiter)
builtins.TypeError: can only concatenate str (not "bytes") to str

Unhandled Error
Traceback (most recent call last):
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/python/log.py", line 103, in callWithLogger
    return callWithContext({"system": lp}, func, *args, **kw)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/python/log.py", line 86, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/python/context.py", line 122, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/python/context.py", line 85, in callWithContext
    return func(*args,**kw)
--- <exception caught here> ---
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/internet/selectreactor.py", line 149, in _doReadOrWrite
    why = getattr(selectable, method)()
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/internet/tcp.py", line 243, in doRead
    return self._dataReceived(data)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/internet/tcp.py", line 249, in _dataReceived
    rval = self.protocol.dataReceived(data)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/protocols/basic.py", line 572, in dataReceived
    why = self.lineReceived(line)
  File "/Users/giacomo/pyenvs/twisted-samples/chat.py", line 21, in lineReceived
    self.handle_GETNAME(line)
  File "/Users/giacomo/pyenvs/twisted-samples/chat.py", line 29, in handle_GETNAME
    self.sendLine("Welcome, %s!" % (name,))
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/protocols/basic.py", line 636, in sendLine
    return self.transport.write(line + self.delimiter)
builtins.TypeError: can only concatenate str (not "bytes") to str

我的系统 Python 是 2.7.16,版本 3 安装了brew.

如果我需要发布有关我的系统的更多信息,请告诉我。

标签: pythonmacosexceptiontwisted

解决方案


这是你的问题:

    return self.transport.write(line + self.delimiter)
builtins.TypeError: can only concatenate str (not "bytes") to str

您正在混合字节和字符串值。您从网络中获得的是一个bytes对象,您必须将其转换strbytes. 您也不能通过str网络发送。所有发送的数据必须是bytes. 所以假设self.delimiter是一个字符串,你只需要修复:

return self.transport.write(line + self.delimiter.decode("utf8"))

附言

无需返回self.transport.write()。而且您提出了一个观点,即这些文档面向 Python 2.7,并且一些示例不适用于 Python3+。在我看来,这是一个错误。这是为 Twisted 做出贡献的好机会;)


推荐阅读