PyInstaller打包selenium-wire過程中常見問題和解決指南
前言
前段時(shí)間做一個內(nèi)網(wǎng)開發(fā)的需求,要求將selenium程序打包成.exe放在內(nèi)網(wǎng)的win7上運(yùn)行,在網(wǎng)上搜了一圈也沒有發(fā)現(xiàn)相關(guān)文章,因此將過程中踩到的坑記錄分享一下。
本文涵蓋了具體打包操作、不同模塊和依賴項(xiàng)的兼容性解決方案,以確保在打包和運(yùn)行時(shí)都能正常工作。
1. 背景
在 Python 項(xiàng)目中,使用第三方庫(如 selenium、selenium-wire、mitmproxy 等)時(shí),會遇到許多依賴項(xiàng),并且由于庫之間的版本兼容性問題,可能導(dǎo)致運(yùn)行時(shí)錯誤。常用的打包工具 PyInstaller 能將 Python 項(xiàng)目打包成單個可執(zhí)行文件,但也會因?yàn)榧嫒菪詥栴}和路徑管理而出現(xiàn)各種運(yùn)行錯誤。因此,本指南總結(jié)了打包過程中常見問題和解決方案,以幫助開發(fā)者順利完成項(xiàng)目的打包和發(fā)布。
2. 可能遇到的問題概述
在PyInstaller打包selenium-wire時(shí)可能會遇到一些問題,如下:
- 依賴沖突:如 pyOpenSSL 與 cryptography 的版本沖突問題。
- 路徑問題:如 chromedriver.exe 在運(yùn)行時(shí)未找到或未正確加載。
- 打包文件缺失:某些文件(如 .crt、.key、chromedriver.exe 等)在打包時(shí)未包含,導(dǎo)致運(yùn)行時(shí)無法找到。
3. PyInstaller 打包步驟及參數(shù)配置
使用 PyInstaller 打包一個 Python 項(xiàng)目時(shí),可以通過以下步驟和命令來生成可執(zhí)行文件:
pyinstaller --onefile --clean --hidden-import=<module> --name=<executable_name> <script.py>
參數(shù)詳解:
- --onefile:將所有文件打包成一個獨(dú)立可執(zhí)行文件。
- --clean:清理之前打包時(shí)的緩存,確保使用最新的依賴版本。
- --hidden-import:指定打包時(shí)包含的隱藏模塊(PyInstaller 有時(shí)無法自動檢測到的依賴)。
- --name:指定打包生成的可執(zhí)行文件名稱。
對于使用 .spec 文件的項(xiàng)目,可以通過如下命令打包:
pyinstaller --clean <spec_file_name>.spec
4. 依賴項(xiàng)版本不兼容問題
4.1 pyOpenSSL 和 cryptography 的兼容性問題
在 PyInstaller 打包的項(xiàng)目中,pyOpenSSL 和 cryptography 是常見依賴。由于版本更新問題,某些版本的 pyOpenSSL 可能無法與較新版本的 cryptography 兼容,導(dǎo)致運(yùn)行時(shí) X509_V_FLAG_NOTIFY_POLICY 等屬性缺失。
常見錯誤:
AttributeError: module 'lib' has no attribute 'X509_V_FLAG_NOTIFY_POLICY'
解決方法:
1.降級 cryptography 版本:建議降級到 3.3.2 版本,確保兼容性。
pip install cryptography==3.3.2
2.降級 pyOpenSSL 版本:使用 20.0.1 版本,這與 cryptography 3.3.2 更加兼容。
pip install pyOpenSSL==20.0.1
3.升級所有相關(guān)依賴:如果使用較舊的版本無效,嘗試升級 selenium-wire、mitmproxy、pyOpenSSL、和 cryptography,確保依賴版本相互兼容。
pip install --upgrade selenium-wire mitmproxy pyOpenSSL cryptography
4.2 chromedriver.exe 打包問題
selenium 使用的 chromedriver.exe 必須在系統(tǒng)的 PATH 中或由代碼顯式指定路徑。然而,打包成單文件后,chromedriver.exe 可能無法正常找到,需要手動配置。
5. 路徑問題及解決方法
5.1 包含 chromedriver.exe 文件
將 chromedriver.exe 文件放在項(xiàng)目目錄下,并在 .spec 文件的 datas 配置中包含此文件,以確保在打包后可以正確引用。
配置示例:
在 .spec 文件中將 chromedriver.exe 添加到 datas:
datas=[ ('<absolute_path>/chromedriver.exe', '.') # 打包到可執(zhí)行文件的根目錄 ]
在代碼中設(shè)置相對路徑以引用 chromedriver.exe 文件,確保在打包后的運(yùn)行環(huán)境中可以正確定位到該文件。
from selenium.webdriver.chrome.service import Service import os import sys def 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. 詳細(xì)解決方案
在打包過程中,還可能遇到其他常見問題,例如文件緩存和打包依賴文件丟失問題。
6.1 清理緩存文件
在打包前,通過 --clean 參數(shù)或手動刪除 build 和 dist 文件夾,確保 PyInstaller 不使用緩存文件:
pyinstaller --clean <spec_file_name>.spec
或者手動刪除 build 和 dist 文件夾:
rmdir /s /q build rmdir /s /q dist
6.2 使用 .spec 文件配置 hiddenimports
如果 PyInstaller 在打包時(shí)無法自動識別所有依賴,可以通過 .spec 文件中的 hiddenimports 參數(shù)顯式指定依賴項(xiàng):
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. 調(diào)試建議
確保依賴版本一致:在開發(fā)和打包環(huán)境中使用相同的依賴版本,防止版本不一致帶來的兼容性問題。
使用虛擬環(huán)境:每個項(xiàng)目單獨(dú)配置虛擬環(huán)境,避免全局環(huán)境中的其他依賴引發(fā)沖突。
分步調(diào)試:打包前在開發(fā)環(huán)境中逐步測試依賴是否正常運(yùn)行。遇到依賴問題,優(yōu)先使用兼容的版本組合。
8.調(diào)試依賴沖突
使用 pip check 命令檢查依賴沖突,并通過 pip freeze 獲取依賴列表,以便管理版本:
pip check # 檢查依賴沖突 pip freeze > requirements.txt # 保存當(dāng)前依賴
總結(jié)
本指南總結(jié)了在使用 PyInstaller 打包 Python 項(xiàng)目時(shí)常見的兼容性問題和解決方法。通過以下步驟,可以顯著提升打包的成功率:
使用兼容的依賴版本,尤其是 pyOpenSSL 和 cryptography。
將 chromedriver.exe 等可執(zhí)行文件顯式添加到 .spec 文件。
在代碼中使用 sys._MEIPASS 以正確引用打包后臨時(shí)解壓目錄中的文件。
嚴(yán)格遵循這些步驟可以有效避免大多數(shù)打包和運(yùn)行時(shí)錯誤,確保項(xiàng)目在各個環(huán)境下穩(wěn)定運(yùn)行。
到此這篇關(guān)于PyInstaller打包selenium-wire過程中常見問題和解決指南的文章就介紹到這了,更多相關(guān)PyInstaller打包項(xiàng)目內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pycharm遠(yuǎn)程調(diào)試openstack代碼
這篇文章主要為大家詳細(xì)介紹了pycharm遠(yuǎn)程調(diào)試openstack的代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11python實(shí)戰(zhàn)scrapy操作cookie爬取博客涉及browsercookie
這篇文章主要為大家介紹了python實(shí)戰(zhàn)scrapy操作cookie爬取博客涉及browsercookie,下面來學(xué)習(xí)一下 scrapy 操作 Cookie來爬取博客吧2021-11-11VScode連接遠(yuǎn)程服務(wù)器上的jupyter notebook的實(shí)現(xiàn)
這篇文章主要介紹了VScode連接遠(yuǎn)程服務(wù)器上的jupyter notebook的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Python基于pycrypto實(shí)現(xiàn)的AES加密和解密算法示例
這篇文章主要介紹了Python基于pycrypto實(shí)現(xiàn)的AES加密和解密算法,結(jié)合實(shí)例形式分析了Python使用pycrypto模塊進(jìn)行AES加密與解密操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-04-04