Python中使用scapy3k和PyQt5开发的抓包软件,用pyinstaller打包成exe后运行报错如何解决?

好像是 from scapy.all import *的时候报错的

'scipy.optimize._trlib._trlib.array' has no attribute 'reduce_cython'

有人知道是怎么回事吗


Python中使用scapy3k和PyQt5开发的抓包软件,用pyinstaller打包成exe后运行报错如何解决?
1 回复

这个问题我遇到过。scapy和PyQt5一起打包时,pyinstaller容易漏掉一些依赖。核心问题是scapy的底层网络库(比如libpcap/WinPcap的绑定)和PyQt5的插件文件没被打包进去。

给你一个能用的 spec 文件配置,这是关键。在你的项目目录下创建一个 build.spec 文件,内容如下:

# -*- mode: python ; coding: utf-8 -*-

a = Analysis(
    ['your_main_script.py'],  # 替换为你的主程序入口文件
    pathex=[],
    binaries=[],
    datas=[],
    hiddenimports=[
        'scapy',
        'scapy.layers',
        'scapy.layers.inet',
        'scapy.layers.l2',
        'scapy.arch',
        'scapy.arch.windows',  # 如果你在Windows上,这个很重要
        # 根据你的scapy版本和使用的协议,可能还需要添加其他模块
        # 例如:'scapy.layers.http', 'scapy.layers.dns'
    ],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
)

# 关键:显式收集PyQt5的Qt插件,尤其是平台插件
pyqt = Tree('C:\\Python39\\Lib\\site-packages\\PyQt5\\Qt5\\plugins\\platforms\\', prefix='PyQt5/Qt/plugins/platforms/')  # 注意:路径要替换为你实际的Python环境和PyQt5安装路径
a.datas += pyqt.datas
a.binaries += pyqt.binaries

# 如果你还用了PyQt5的其他插件(如图像格式支持),也要类似添加
# pyqt_imageformats = Tree('...\\PyQt5\\Qt5\\plugins\\imageformats\\', prefix='PyQt5/Qt/plugins/imageformats/')
# a.datas += pyqt_imageformats.datas
# a.binaries += pyqt_imageformats.binaries

pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas,
    [],
    name='YourAppName',  # 你的exe名字
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=False,  # 如果你的PyQt5是GUI程序,设为False;如果需要看错误日志,可以先设为True
    icon='your_icon.ico',  # 可选,你的图标
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)
coll = COLLECT(
    exe,
    a.binaries,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='YourAppName',
)

使用步骤:

  1. 把上面 spec 文件里的注释说明都看清楚,把路径和名字改成你自己的。
  2. 在命令行里运行打包命令,指定这个 spec 文件:
    pyinstaller build.spec
    
  3. 打包完成后,检查 dist/YourAppName/ 目录下,应该会有一个 PyQt5/Qt/plugins/platforms/ 文件夹,里面有 qwindows.dll 等文件。如果没有,说明路径没配对。

如果还报错,特别是关于 libpcapNpcap 的,你需要确保目标电脑上安装了 Npcap(Windows推荐)或 WinPcap。scapy在Windows上依赖这个。有时候需要把 Npcap 的安装目录(默认是 C:\Windows\System32\Npcap\)下的 wpcap.dllPacket.dll 手动复制到你的 dist/YourAppName/ 目录下试试。

总结:重点就是通过 spec 文件手动补全隐藏导入和Qt插件。

回到顶部