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',
)
使用步骤:
- 把上面
spec文件里的注释说明都看清楚,把路径和名字改成你自己的。 - 在命令行里运行打包命令,指定这个
spec文件:pyinstaller build.spec - 打包完成后,检查
dist/YourAppName/目录下,应该会有一个PyQt5/Qt/plugins/platforms/文件夹,里面有qwindows.dll等文件。如果没有,说明路径没配对。
如果还报错,特别是关于 libpcap 或 Npcap 的,你需要确保目标电脑上安装了 Npcap(Windows推荐)或 WinPcap。scapy在Windows上依赖这个。有时候需要把 Npcap 的安装目录(默认是 C:\Windows\System32\Npcap\)下的 wpcap.dll 和 Packet.dll 手动复制到你的 dist/YourAppName/ 目录下试试。
总结:重点就是通过 spec 文件手动补全隐藏导入和Qt插件。

