python 3 : ResourceWarning Unclosed

标签 python python-3.x ssl cloudflare

我有一个用 Python 编写的 Reddit 机器人,有时我会收到以下错误:

sys:1: ResourceWarning: unclosed ssl.SSLSocket fd=4, family=AddressFamily.AF_INET, type=2049, proto=6, laddr=('192.168.1.113', 55513), raddr=('198.41.209.140', 443)>

192.168.1.113 是我的本地 IP,198.41.209.140 显然是 CloudFlare 的 IP

我有时也会收到以下错误,这让我认为问题与 SSL 有关?

Error EOF occurred in violation of protocol (_ssl.c:598)

我该如何解决这个问题?

编辑:如何查看我的代码的哪一部分导致了这个问题?我在 try/except 中有一个异常,将所有异常打印为:

except Exception as e:
    print("Login/API Error", e)

但是我得到的所有错误都没有这个,这意味着它不是异常(exception)?

最佳答案

我没有在自己的代码中使用套接字,所以下面是基于我的一般 Python 知识。

套接字文档没有说 socket.socket 实例是上下文管理器,但该类具有必需的 __enter____exit__方法。两者都是标准的、最小的实现。您可能希望继承 socket 或 SSLSocket 以在 __exit__ 中执行更多操作,例如打印您的替代品以进行回溯。但首先,您需要查看完整的回溯。子类 SSLSocket 继承了这两种方法。由于 SSLSocket “包装”了一个套接字,显然有两个对象需要关注。因此,对于代码的顶层结构,我将从以下内容(显然未经测试)开始:

<preliminary code>
with socket.socket(...) as sock  # or other socket-returning function
  <more preparation>
  with ssl.wrap_socket(sock, ...) as SSLsock # or the context function
    <use SSLsock to communicate>

您收到的错误消息应该以 SSLEOFError 为前缀。是吗?文档说“当 SSL 连接突然终止时引发的 SSLError 的子类。通常,遇到此错误时,您不应尝试重用底层传输。”这绝对是一个异常(exception)。

>>> issubclass(ssl.SSLEOFError, Exception)
True

什么可能会促使 Cloudfare ‘突然’终止连接?协议(protocol)处理中的错误; ssl.py 中的错误?您的机器人是否以某种方式违反了服务条款?

如果你不能在这里得到你需要的所有答案,我会尝试 python-list,也可以作为新闻组 gmane.comp.python.general 访问 >news.gmane.org。它的参与者具有网络经验。

关于 python 3 : ResourceWarning Unclosed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34518251/

相关文章:

单击矩形时的python tkinter Canvas

python - 使用 Python 而不是 HTML 从网站中提取链接

node.js - 是否有推荐的方法在不终止 Node 进程的情况下重启 node.js https 服务器?

Python网络编程项目?

Python:排序时处理异常

python - 传递cursor.execute mysql 查询中的元素列表

python - 将 'From header' 添加到电子邮件中?

java - 如何修复 SSLProtocolException : handshake alert: unrecognized_name without disabling SNI

python - 从列表中的列表中删除空值

Python 3 网页转行