Python调用socket.recv返回值使用.find()报参数类型错误如何解决
问题根因
你报错的运行环境使用的是Python 3解释器,而PyCharm中运行时选择的是Python 2解释器,二者socket接口的返回类型存在差异:
- Python 2中,
socket.recv()返回值为str字符串类型,直接调用.find("PING")传入字符串参数完全符合语法要求。 - Python 3中,
socket.recv()返回值为bytes字节类型,字节对象的find()方法仅支持接收bytes类型参数,你传入字符串"PING"就会触发类型不匹配的报错。
为什么完整脚本在PyCharm运行正常
你参考的原始脚本是基于Python 2.x语法编写的,PyCharm运行该脚本时,项目配置的默认解释器为Python 2.x版本,完全匹配脚本的运行依赖,因此不会出现类型错误。
适配Python 3的修改方案
如果你需要在Python 3环境下运行该代码,任选一种修改方式即可:
- 直接修改查找参数为bytes类型:将
if text.find("PING") != -1:改为if text.find(b"PING") != -1: - 先对返回内容做解码:在
text = irc.recv(2048)后新增解码逻辑:
后续所有字符串操作都可以直接使用str类型参数。text = text.decode('utf-8', errors='ignore')
内容的提问来源于stack exchange,提问作者saphintosh
相关产品推荐
相关产品推荐

