Python项目打包指南:PyInstaller与SeleniumWire的兼容性挑战及解决方案
前言
前段时间做一个内网开发的需求,要求将selenium程序打包成.exe放在内网的win7上运行,在掘金搜了一圈也没有发现相关文章,因此将过程中踩到的坑记录分享一下。
本文涵盖了具体打包操作、不同模块和依赖项的兼容性解决方案,以确保在打包和运行时都能正常工作。
1. 背景
在 Python 项目中,使用第三方库(如 selenium
、selenium-wire
、mitmproxy
等)时,会遇到许多依赖项,并且由于库之间的版本兼容性问题,可能导致运行时错误。常用的打包工具 PyInstaller
能将 Python 项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运行错误。因此,本指南总结了打包过程中常见问题和解决方案,以帮助开发者顺利完成项目的打包和发布。
2. 可能遇到的问题概述
在PyInstaller
打包selenium-wire
时可能会遇到一些问题,如下:
- 依赖冲突:如
pyOpenSSL
与cryptography
的版本冲突问题。 - 路径问题:如
chromedriver.exe
在运行时未找到或未正确加载。 - 打包文件缺失:某些文件(如
.crt
、.key
、chromedriver.exe
等)在打包时未包含,导致运行时无法找到。
3. PyInstaller 打包步骤及参数配置
使用 PyInstaller
打包一个 Python 项目时,可以通过以下步骤和命令来生成可执行文件:
pyinstaller --onefile --clean --hidden-import=<module> --name=<executable_name> <script.py>
参数详解:
--onefile
:将所有文件打包成一个独立可执行文件。--clean
:清理之前打包时的缓存,确保使用最新的依赖版本。--hidden-import
:指定打包时包含的隐藏模块(PyInstaller 有时无法自动检测到的依赖)。--name
:指定打包生成的可执行文件名称。
对于使用 .spec
文件的项目,可以通过如下命令打包:
pyinstaller --clean <spec_file_name>.spec
4. 依赖项版本不兼容问题
4.1 pyOpenSSL
和 cryptography
的兼容性问题
在 PyInstaller
打包的项目中,pyOpenSSL
和 cryptography
是常见依赖。由于版本更新问题,某些版本的 pyOpenSSL
可能无法与较新版本的 cryptography
兼容,导致运行时 X509_V_FLAG_NOTIFY_POLICY
等属性缺失。
常见错误:
AttributeError: module 'lib' has no attribute 'X509_V_FLAG_NOTIFY_POLICY'
解决方法:
- 降级
cryptography
版本:建议降级到3.3.2
版本,确保兼容性。
pip install cryptography==3.3.2
- 降级
pyOpenSSL
版本:使用20.0.1
版本,这与cryptography 3.3.2
更加兼容。
pip install pyOpenSSL==20.0.1
- 升级所有相关依赖:如果使用较旧的版本无效,尝试升级
selenium-wire
、mitmproxy
、pyOpenSSL
、和cryptography
,确保依赖版本相互兼容。
pip install --upgrade selenium-wire mitmproxy pyOpenSSL cryptography
4.2 chromedriver.exe
打包问题
selenium
使用的 chromedriver.exe
必须在系统的 PATH
中或由代码显式指定路径。然而,打包成单文件后,chromedriver.exe
可能无法正常找到,需要手动配置。
5. 路径问题及解决方法
5.1 包含 chromedriver.exe
文件
将 chromedriver.exe
文件放在项目目录下,并在 .spec
文件的 datas
配置中包含此文件,以确保在打包后可以正确引用。
配置示例:
- 在
.spec
文件中将chromedriver.exe
添加到datas
:
datas=[('<absolute_path>/chromedriver.exe', '.') # 打包到可执行文件的根目录
]
- 在代码中设置相对路径以引用
chromedriver.exe
文件,确保在打包后的运行环境中可以正确定位到该文件。
from selenium.webdriver.chrome.service import Service
import os
import sysdef resource_path(relative_path):if hasattr(sys, '_MEIPASS'):return os.path.join(sys._MEIPASS, relative_path)return os.path.join(os.path.abspath("."), relative_path)chrome_driver_path = resource_path("chromedriver.exe")
service = Service(executable_path=chrome_driver_path)
6. 详细解决方案
在打包过程中,还可能遇到其他常见问题,例如文件缓存和打包依赖文件丢失问题。
6.1 清理缓存文件
在打包前,通过 --clean
参数或手动删除 build
和 dist
文件夹,确保 PyInstaller
不使用缓存文件:
pyinstaller --clean <spec_file_name>.spec
或者手动删除 build
和 dist
文件夹:
rmdir /s /q build
rmdir /s /q dist
.spec
文件配置 hiddenimports
6.2 使用 如果 PyInstaller
在打包时无法自动识别所有依赖,可以通过 .spec
文件中的 hiddenimports
参数显式指定依赖项:
hiddenimports=['mitmproxy', 'seleniumwire', 'OpenSSL', 'cryptography'],
6.3 将证书文件包含在打包中
某些依赖(如 selenium-wire
)使用的 .crt
和 .key
文件也需手动包含:
datas=[('<absolute_path>/seleniumwire/ca.crt', 'seleniumwire'),('<absolute_path>/seleniumwire/ca.key', 'seleniumwire')
],
7. 调试建议
- 确保依赖版本一致:在开发和打包环境中使用相同的依赖版本,防止版本不一致带来的兼容性问题。
- 使用虚拟环境:每个项目单独配置虚拟环境,避免全局环境中的其他依赖引发冲突。
- 分步调试:打包前在开发环境中逐步测试依赖是否正常运行。遇到依赖问题,优先使用兼容的版本组合。
调试依赖冲突
使用 pip check
命令检查依赖冲突,并通过 pip freeze
获取依赖列表,以便管理版本:
pip check # 检查依赖冲突
pip freeze > requirements.txt # 保存当前依赖
总结
本指南总结了在使用 PyInstaller
打包 Python 项目时常见的兼容性问题和解决方法。通过以下步骤,可以显著提升打包的成功率:
- 使用兼容的依赖版本,尤其是
pyOpenSSL
和cryptography
。 - 将
chromedriver.exe
等可执行文件显式添加到.spec
文件。 - 在代码中使用
sys._MEIPASS
以正确引用打包后临时解压目录中的文件。
严格遵循这些步骤可以有效避免大多数打包和运行时错误,确保项目在各个环境下稳定运行。
相关文章:
Python项目打包指南:PyInstaller与SeleniumWire的兼容性挑战及解决方案
前言 前段时间做一个内网开发的需求,要求将selenium程序打包成.exe放在内网的win7上运行,在掘金搜了一圈也没有发现相关文章,因此将过程中踩到的坑记录分享一下。 本文涵盖了具体打包操作、不同模块和依赖项的兼容性解决方案,以…...
浅谈微信视频号推荐算法
这次可能会稍微有点干货,但保证不晦涩~ 一、算法推荐的本质:猜你喜欢 vs 社交绑架 视频号的推荐系统本质上在做两件事: 预测你的兴趣:通过你的浏览、点赞、评论、分享等行为,分析你的偏好。满足社交需求&…...
selenium 常用方法
selenium 库的常用方法: 方法说明示例代码webdriver.Chrome()初始化 Chrome 浏览器实例。driver webdriver.Chrome()driver.get(url)访问指定的 URL 地址。driver.get("https://example.com")driver.find_element(By, value)查找第一个匹配的元素。elem…...
springboot中使用async实现异步编程
目录 1.说明 2.实现原理 3.示例 4.总结 1.说明 Async 是 Spring 框架提供的一个注解,用于标记方法为异步执行。被标记的方法将在调用时立即返回,而实际的方法执行将在单独的线程中进行。 Async 注解有一个可选属性:指定要使用的特定线程…...
【2024年蓝桥杯Java B组】省赛真题详细解析
【2024年蓝桥杯Java B组】省赛真题 距离比赛仅剩5天,大多数省份可能完成3-4题即可拿到省奖,2025年想要拿到省奖,需要高效利用时间,重点突破关键知识点和题型。这里以【2024年蓝桥杯Java B组省赛真题】为例,梳理我们最后…...
SQL:DDL(数据定义语言)和DML(数据操作语言)
目录 什么是SQL? 1. DDL(Data Definition Language,数据定义语言) 2. DML(Data Manipulation Language,数据操作语言) DDL和DML的区别 什么是SQL? SQL(Structured …...
机器学习核心概念、算法分类与应用场景全解析
文章目录 一、基础任务与算法分类1. 分类任务(监督学习)2. 回归任务(监督学习)3. 聚类任务(无监督学习) 二、关键流程与技术细节1. 数据预处理2. 特征工程3. 数据集划分与评估 三、进阶技术1.深度学习2.强化…...
【leetcode】—416.分割等和子集
✏️ 关于专栏:专栏用于记录 LeetCode 中做题与总结 文章目录 分割等和子集▐ 题目描述▐ 题目示例▐ 题目提示▐ 思路&代码方法:动态规划 分割等和子集 ▐ 题目描述 题目链接:分割等和子集 给你一个 只包含正整数 的 非空 数组 nums …...
jemeter 之mysql驱动问题
问题 java.sql.SQLException: No suitable driver found for jdbc:mysql 解决 先把jar放到lib下 检查 JMeter 的 Classpath 在 JMeter 中,JDBC 驱动需要手动添加到 Classpath 中。 打开 JMeter 安装目录下的 bin/jmeter.properties 文件,找到 user.cla…...
隐私计算的崛起:数据安全的未来守护者
在信息技术(IT)的滚滚浪潮中,一种新兴技术正以惊人速度崭露头角——隐私计算(Privacy-Preserving Computation)。2025 年,随着数据泄露事件频发、全球隐私法规日益严格,以及企业对数据协作需求的…...
Excel计数、求和、统计、计算类函数
目录 一、计数函数1. COUNT2. COUNTA3. COUNTBLANK4. COUNTIF5. COUNTIFS 二、求和函数1. SUM2. SUMIF3. SUMIFS4. SUMPRODUCT 三、统计函数1. AVERAGE2. AVERAGEA3. AVERAGEIF 函数4. AVERAGEIFS 函数 四、其他常用计算函数1. MAX 与 MIN2. RANK3. MOD4. ROUND5. FLOOR6. INT7…...
解决 Kubernetes 中容器 `CrashLoopBackOff` 问题的实战经验
在 Kubernetes 集群中,容器状态为 CrashLoopBackOff 通常意味着容器启动失败,并且 Kubernetes 正在不断尝试重启它。这种状态表明容器内可能存在严重错误,如应用异常、依赖服务不可用、配置错误等。本文将分享一次实际排障过程,并…...
北师大具身AI的虚拟世界扩展!UNREALZOO:为具身智能打造高逼真度的虚拟世界
作者:Fangwei Zhong, Kui Wu, Churan Wang, Hao Chen, Hai Ci, Zhoujun Li, Yizhou Wang 单位:北京师范大学,北京航空航天大学,北京大学,BIGAI,澳门城市大学,新加坡国立大学 论文标题…...
2025 年浙江保安员职业资格考试高效备考指南
浙江以创新活力著称,保安行业也在不断革新。2025 年考试报考条件常规,报名主要通过浙江省保安服务监管信息系统,方便快捷。 理论考试在传统知识基础上,加大对智能安防技术应用的考查,如人脸识别系统、智能监控报警系…...
创意设计:动态彩色数学爱心
设计理念 数学之美:使用心形线的数学方程(心形曲线)生成爱心形状。视觉吸引力:通过 Python 的 colorama 库添加颜色渐变效果。动态感:加入简单的动画,让爱心“跳动”。技术魅力:结合模块化编程…...
C++动态内存管理完全指南:从基础到现代最佳实践
一、动态内存基础原理 1.1 内存分配层次结构 内存类型生命周期分配方式典型使用场景静态存储区程序整个运行期编译器分配全局变量、静态变量栈内存函数作用域自动分配/释放局部变量堆内存手动控制new/malloc分配动态数据结构 1.2 基本内存操作函数 // C风格 void* malloc(s…...
ebpf: CO-RE, BTF, and Libbpf(一)
本文内容主要来源于Learning eBPF,可阅读原文了解更全面的内容。 概述 一个ebpf程序可以在一个kernel版本中编译,而在另外一个kernel版本上运行,即便两个kernel版本中有些结构体有变化。而BTF(BPF Type Format) 是能让ebpf有这种强大兼容性…...
Linux 递归查找并删除目录下的文件
在 Linux 中,可以使用 find 命令递归查找并删除目录下的文件 1、示例命令 find /path/to/directory -type f -name "filename_pattern" -exec rm -f {} 2、参数说明 /path/to/directory:要查找的目标目录type f:表示查找文件&am…...
使用人工智能大模型腾讯元宝,如何快速编写活动记录?
今天我们学习使用人工智能大模型腾讯元宝,如何快速编写活动记录? 手把手学习视频地址https://edu.csdn.net/learn/40402/666457 第一步在腾讯元宝对话框中输入如何协助老师写教研活动记录,通过提问,我们了解了老师写教研活动记录…...
File 类的用法和 InputStream, OutputStream 的用法
1 文件系统的操作 创建文件,删除文件,创建目录,重命名文件,判定文件存在... Java中提供file类进行文件系统操作,使用路径进行初始化表示具体的文件(可以存在,也可以不存在)…...
buuctf--[湖南省赛2019]Findme
目录 前沿 解题过程 分析 p1 P2 p3 p4 p5 前沿 其实对于这道题呢,我的想法是不知道怎么判断的,这个题你说他难吧,他用的都是比较基础的东西,说他简单吧,他有太复杂的过程,总体来讲࿰…...
【从0到1学MybatisPlus】MybatisPlus入门
Mybatis-Plus 使用场景 大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。 因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国…...
【S32M244 RTD200P04 LLD篇8】S32M244 PWM ADC LLD demo
【S32M244 RTD200P04 LLD篇8】S32M244 PWM ADC LLD demo 一,文档简介二,PWMTRGMUXPDBADC 2ch 软件配置与实现2.1 软硬件版本平台2.2 Demo CT 模块配置2.2.1 引脚配置2.2.2 时钟配置2.2.3 外设配置 2.3主程序调用情况 三, 测试结果 一…...
(蓝桥杯)动态规划蓝桥杯竞赛指南:动态规划解决最少钞票数问题(超详细解析+代码实现)
问题描述 近期,黄开的银行新发行了一种面额为 4 的钞票,使得钞票种类增至 5 种:20、10、5、4 和 1 元。银行在发钞时十分“节俭”,当有客户取钱时,需要以最少的钞票数来满足取款金额。 问题要求: 对于给定…...
深度:善用人工智能推动高等教育学习、教学与治理的深层变革
在人工智能技术与教育深度融合的当下,高等教育正经历着前所未有的范式转型。从学习方式的革新到教学模式的重构,再到治理体系的升级,人工智能已不再仅仅是辅助工具,而是成为重塑高等教育生态的核心驱动力。这一变革浪潮中,生成式人工智能(Generative AI)作为技术前沿的代…...
python全栈-JavaScript
python全栈-js 文章目录 js基础变量与常量JavaScript引入到HTML文件中JavaScript注释与常见输出方式 数据类型typeof 显示数据类型算数运算符之加法运算符运算符之算术运算符运算符之赋值运算符运算符之比较运算符运算符之布尔运算符运算符之位运算符运算符优先级类型转换 控制…...
Django信号使用完全指南示例
推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 **引言:****先决条件:****目录:****1. 什么是Django信号?****2:设置你的Django项目****2.1. 安装Django**2.2. 创建一个Django项…...
# 深入理解GPT:架构、原理与应用示例
深入理解GPT:架构、原理与应用示例 一、引言 GPT(Generative Pre-trained Transformer)系列模型自2018年问世以来,凭借其强大的文本生成能力和多任务适应性,彻底改变了自然语言处理(NLP)领域。…...
C语言递归
一、递归的核心原理 1. 递归的本质 自相似性:将问题分解为与原问题结构相同但规模更小的子问题(如树的遍历、分治算法)。 栈机制:每次递归调用都会在内存栈中创建一个新的函数栈帧,保存当前状态(参数、局…...
Jetpack Compose 基础组件学习2.0
文章目录 1、kotlin版本修改问题修改2、前言:参考知识点: 3、文字超链接的实现新版实现(Text AnnotatedString实现效果) 4、文字强调效果( Material3 的透明度方案)material依赖实现文字强调效果ÿ…...
MySQL SQL 优化的10个关键方向
1. 索引优化 合理创建索引:为高频查询条件、JOIN字段、排序字段创建索引 复合索引设计:遵循最左前缀原则,将选择性高的列放在前面 避免索引失效:防止索引列上使用函数、类型转换、OR条件不当使用 覆盖索引:尽量让查…...
babel-runtime 如何缩小打包体积
🤖 作者简介:水煮白菜王,一位前端劝退师 👻 👀 文章专栏: 前端专栏 ,记录一下平时在博客写作中,总结出的一些开发技巧和知识归纳总结✍。 感谢支持💕💕&#…...
VMware Fusion虚拟机Mac版安装CentOS Stream 9
VMware Fusion虚拟机Mac版安装CentOS Stream 9 文章目录 VMware Fusion虚拟机Mac版安装CentOS Stream 9一、介绍二、效果三、下载 一、介绍 CentOS Stream 9是CentOS Stream发行版的最新主要版本,旨在提供Red Hat Enterprise Linux(RHEL)的每…...
手搓多模态-05 transformer编码层
前情回顾 前面我们已经实现一个图像嵌入层和顶层的模型调度: class SiglipVisionTransformer(nn.Module): ##视觉模型的第二层,将模型的调用分为了图像嵌入模型和transformer编码器模型的调用def __init__(self, config:SiglipVisionConfig):super().__i…...
LightTrack + VOT2019 + Jetson 部署全流程指南【轻量级目标跟踪】
LightTrack VOT2019 Jetson 部署全流程指南【轻量级目标跟踪】 🔧 1. 环境准备(Jetson 平台)推荐配置:⚙️ 安装 Python 3.6 虚拟环境(Jetson 原生 Python 版本较新) 📥 2. 下载 LightTrack 源…...
【Easylive】视频删除方法详解:重点分析异步线程池使用
【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 方法整体功能 这个deleteVideo方法是一个综合性的视频删除操作,主要完成以下功能: 权限验证:检查视频是否存在及用户是否有权限删除核心数据删除&…...
(C语言)循环单链表(数据结构)(指针)(循环列表教程)
目录 源代码: 代码详解: 1. 头文件和宏定义 2. 类型定义 3. 初始化链表 4. 判断链表是否为空 5. 求链表的长度 6. 清空链表 7. 销毁链表 8. 链表的插入(头插法) 9. 链表的插入(尾插法) 10. 查看…...
Debian 12 服务器搭建Beego环境
一、Debian 12系统准备 1.更新系统 #apt update && apt upgrade -y 2.安装基础工具 #apt install -y git curl wget make gcc 二、安装Go环境 Go语言的镜像官网:https://golang.google.cn/ 1.下载go最新版 #cd /usr/local/src #wget -o https://golang.go…...
淘宝商品评论API接口概述及JSON数据参考(测试)
前言 一、淘宝商品评论API接口概述 淘宝商品评论API接口是淘宝开放平台提供的一项服务,允许开发者通过HTTP请求获取指定商品的评论数据。这些数据包括评论内容、评论者信息、评分、评论时间等,为开发者提供了丰富的商品评价信息,有助于分析…...
AI:决策树、决策森林与随机森林
决策树与随机森林:从原理到实战的全面解析(2025最新版) 引言 在机器学习的世界里,决策树和森林模型(包括随机森林)常常是数据科学家们常用的工具之一。无论是初学者还是资深从业者,理解这些模型的原理和应用,都能帮助你在数据分析和预测任务中获得更好的结果。本文将…...
图形化编程语言:低代码赛道的技术革命与范式突破
在 2024 年 Gartner 低代码平台魔力象限报告中,传统低代码厂商市场份额增速放缓至 12%,而图形化编程语言赛道融资额同比激增 370%。本文深度剖析低代码平台的技术瓶颈,系统阐释图形化编程语言的核心优势,揭示其如何重构软件开发范…...
EdgeInfinite: 用3B模型处理无限长的上下文
论文标题 EdgeInfinite: A Memory-Efficient Infinite-Context Transformer for Edge Devices 论文地址 https://arxiv.org/pdf/2503.22196 作者背景 vivo,浙江大学 代码 The code will be released after the official audit. 动机 self-attention的二次时…...
大模型论文:Improving Language Understanding by Generative Pre-Training
大模型论文:Improving Language Understanding by Generative Pre-Training OpenAI2018 文章地址:https://www.mikecaptain.com/resources/pdf/GPT-1.pdf 摘要 自然语言理解包括各种各样的任务,如文本蕴涵、问题回答、语义相似性评估和文…...
springboot 项目怎样开启https服务
要在Spring Boot项目中启用HTTPS服务,请按照以下步骤操作: 1. 生成SSL证书密钥库 使用keytool生成自签名证书 在终端或命令行工具中运行以下命令,生成一个PKCS12格式的密钥库文件: keytool -genkeypair -alias myapp -keyalg …...
R语言之mlr依赖包缺失警告之分析
因为本地没有网络,所有相关的依赖包都是手动下载,再使用脚本一键安装的。 在使用mlr包时,执行下面的代码时,总是报各种依赖缺失,也不知道咋看FAIL信息。 # 建模与调参 # 查阅线性回归、随机森林、xgboost和KNN四种模…...
如何记录日常笔记
关于用Obsidian记日常笔记这事儿,我的经验是别想得太复杂。刚开始用的时候总想着要搞个完美的分类系统,后来发现简单粗暴反而最实用。 文件夹分两类就够了——比如「工作记录」扔一个文件夹,「读书笔记」扔另一个,别分太细&#…...
Completablefuture的底层原理是什么
参考面试回答: 个人理解 CompletableFuture 是 Java 8 引入的一个类、它可以让我们在多线程环境中更加容易地处理异步任务。CompletableFuture 的底层原理是基于一个名为 FutureTask 的机制、结合了 监听器模式 和 等待-通知机制 来处理异步计算。 1.首先就是Com…...
Linux学习笔记(1) 目录结构与路径描述:对比 Windows 系统差异(期末,期中复习笔记全)
前言 一、Linux 的目录结构 二、Linux 路径的描述方式 三、总结 前言 在计算机操作系统的领域中,Linux 和 Windows 是两大主流系统。它们在目录结构和路径描述方式上存在显著不同,理解这些差异对于熟练掌握 Linux 系统至关重要。 一、Linux 的目录结构…...
《算法笔记》10.3小节——图算法专题->图的遍历 问题 A: 第一题
题目描述 该题的目的是要你统计图的连通分支数。 输入 每个输入文件包含若干行,每行两个整数i,j,表示节点i和j之间存在一条边。 输出 输出每个图的联通分支数。 样例输入 1 4 4 3 5 5样例输出 2 分析: 由于题目没给出范围࿰…...
【docker】
1.构建jar包 2.构建自定义的镜像dockerfile vim Dockerfile # 使用 OpenJDK 17 作为基础镜像,该镜像包含 JDK 17 环境 # 该镜像适用于需要编译或运行基于 JDK 17 的 Java 应用程序FROM openjdk:8-jdk-alpine# 设置容器中的工作目录为 /app # 所有后续操作…...