Docker环境下Python使用socketserver运行代码报AttributeError: __exit__求助
问题解决方法
报错根因
你遇到的AttributeError: __exit__报错,是因为当前运行环境的Python版本低于3.3。socketserver.TCPServer从Python3.3版本才开始支持上下文管理器(即with语句的用法),低于该版本的Python中TCPServer没有实现上下文管理所需的__enter__和__exit__方法,因此无法放在with语句中使用。
修复方案
方案1:适配低版本Python(无需升级环境)
去掉服务端的with语句,手动管理服务的生命周期即可,同时注意Docker部署时的绑定地址问题:
if __name__ == "__main__": # Docker环境下必须绑定0.0.0.0才能被容器外部访问,不能用localhost HOST, PORT = "0.0.0.0", 58333 server = socketserver.TCPServer((HOST, PORT), MyTCPHandler) try: server.serve_forever() except KeyboardInterrupt: # 处理Ctrl-C中断信号 pass finally: # 手动关闭服务释放端口 server.server_close()
方案2:升级Python版本
将运行环境的Python版本升级到3.3及以上,原有代码无需修改即可正常运行。
额外注意事项
- 客户端最后一行代码存在格式问题:服务端返回的是字符串类型的索引数字,不是JSON格式,因此不需要调用
json.loads(),直接输出received即可,否则会触发JSON解析报错。 - Docker部署时需要将容器的58333端口映射到宿主机端口,同时客户端的连接地址要改成宿主机的IP或者容器的IP,不能用localhost。
内容的提问来源于stack exchange,提问作者Tennis Tubbies
相关产品推荐
相关产品推荐

