python - 在 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
.
如果我需要发布有关我的系统的更多信息,请告诉我。
解决方案
这是你的问题:
return self.transport.write(line + self.delimiter)
builtins.TypeError: can only concatenate str (not "bytes") to str
您正在混合字节和字符串值。您从网络中获得的是一个bytes
对象,您必须将其转换str
为bytes
. 您也不能通过str
网络发送。所有发送的数据必须是bytes
. 所以假设self.delimiter
是一个字符串,你只需要修复:
return self.transport.write(line + self.delimiter.decode("utf8"))
附言
无需返回self.transport.write()
。而且您提出了一个观点,即这些文档面向 Python 2.7,并且一些示例不适用于 Python3+。在我看来,这是一个错误。这是为 Twisted 做出贡献的好机会;)
推荐阅读
- git - 使用 Git Bash/Terminal 将文件推送到 Github 存储库的特定目录
- wix - 如何使用 WiX RegistrySearch 检查注册表项是否存在?
- node.js - 错误:带有 docker-compose 服务器定义的 getaddrinfo ENOTFOUND
- python - 将 .py 文件转换为 .pyd 文件时的 UndefinedVariableError 包括 df.query("foo=@bar") 之类的行
- java - ImageIO.write() 不保存文件
- react-native - 我们在 React Native 中有事件监听器吗?
- javascript - 使用 JavaScript 中的特定函数初始化数组中每个元素的值
- windows - 如何使用 Powershell 在辅助应用程序中使用函数打开带有空格的文件?
- r - ggplot2:如何在将条形图保持在相同位置的同时更改点图的位置
- html - 背景图像未出现在转换为 pdf 的 html 中