You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pyshark抓包遇signal handler TypeError错误,求问题原因

Pyshark LiveCapture 出现 asyncio 信号处理错误的原因与解决办法

我来帮你分析这个问题——你遇到的这个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:23:09