使用pyshark抓包遇signal handler TypeError错误,求问题原因
我来帮你分析这个问题——你遇到的这个TypeError,根源是Python 3.5的asyncio模块和pyshark的事件循环处理逻辑不兼容,具体细节和解决办法如下:
问题原因
Ubuntu 16.04默认搭载的Python 3.5,其asyncio模块在处理信号清理时的逻辑比较严格:要求信号处理函数必须是signal.SIG_IGN、signal.SIG_DFL或者可调用对象。而pyshark在销毁LiveCapture对象时,内部的事件循环在清理信号处理函数时,传递了不符合要求的值,最终触发了这个错误。
这个问题是Python 3.5的asyncio的局限性导致的,在Python 3.6及以上版本中,asyncio模块修复了相关的信号处理逻辑,不会再出现这类错误。
解决办法
这里给你三个可行的方案,你可以根据自己的需求选择:
升级Python版本(最推荐)
这是彻底解决问题的办法,你可以在Ubuntu 16.04上通过PPA安装Python 3.6及以上版本:sudo add-apt-repository ppa:deadsnakes/ppa sudo apt-get update sudo apt-get install python3.6 python3.6-pip之后用新版本的pip安装pyshark:
pip3.6 install pyshark升级后,asyncio的信号处理逻辑已经优化,这个错误会直接消失。
手动管理事件循环生命周期
如果不想升级Python,可以在脚本里主动控制asyncio事件循环的关闭,避免销毁阶段触发错误。修改后的代码示例:import pyshark import asyncio print('Pyshark demo') capture = pyshark.LiveCapture(interface='enp0s8') try: # 示例:抓包5秒,你可以替换成自己的抓包逻辑 capture.sniff(timeout=5) finally: # 手动关闭事件循环,避免自动清理时出错 loop = asyncio.get_event_loop() if not loop.is_closed(): loop.close()回退到兼容Python 3.5的pyshark版本
尝试安装对Python 3.5支持更好的旧版pyshark,比如0.4.3版本:pip install pyshark==0.4.3这个版本虽然缺少一些新功能,但能解决当前的兼容性问题。
内容的提问来源于stack exchange,提问作者Konstantina Bozionelou

