使用auto-py-to-exe打包Python程序缺失browserforge依赖文件求助
解决auto-py-to-exe打包browserforge库时缺失文件的问题
问题场景
运行auto-py-to-exe打包生成的main.exe时触发FileNotFoundError,程序无法找到browserforge依赖的JSON资源文件,错误日志如下:
C:\Users\jacob\Documents\output>main.exe browser-helper-file.json ---------------------------------------- 0% 0/? bytes ? header-network.json ---------------------------------------- 0% 0/? bytes ? headers-order.json ---------------------------------------- 0% 0/? bytes ? input-network.json ---------------------------------------- 0% 0/? bytes ? fingerprint-network.json ---------------------------------------- 0% 0/? bytes ? Traceback (most recent call last): File "main.py", line 4, in <module> File "<frozen importlib._bootstrap>", line 1360, in _find_and_load File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 935, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 378, in exec_module File "browserforge\injectors\__init__.py", line 1, in <module> File "<frozen importlib._bootstrap>", line 1360, in _find_and_load File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 935, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 378, in exec_module File "browserforge\injectors\utils.py", line 8, in <module> File "<frozen importlib._bootstrap>", line 1360, in _find_and_load File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 935, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 378, in exec_module File "browserforge\fingerprints\__init__.py", line 3, in <module> File "browserforge\download.py", line 159, in DownloadIfNotExists File "browserforge\download.py", line 150, in Download File "asyncio\runners.py", line 194, in run File "asyncio\runners.py", line 118, in run File "asyncio\base_events.py", line 687, in run_until_complete File "browserforge\download.py", line 145, in AsyncDownload File "browserforge\download.py", line 137, in download File "browserforge\download.py", line 111, in _download_and_extract File "browserforge\download.py", line 75, in _download_file File "aiofiles\base.py", line 63, in __aenter__ File "aiofiles\base.py", line 59, in __await__ File "aiofiles\threadpool\__init__.py", line 92, in _open File "concurrent\futures\thread.py", line 58, in run FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\jacob\\AppData\\Local\\Temp\\_MEI64042\\browserforge\\headers\\data\\browser-helper-file.json' [PYI-7868:ERROR] Failed to execute script 'main' due to unhandled exception!
已尝试通过auto-py-to-exe添加缺失文件但无效,且在安装了所有依赖的虚拟环境中运行auto-py-to-exe。
解决方案
1. 准确定位browserforge资源文件
找到虚拟环境中browserforge的安装目录(示例路径:venv\Lib\site-packages\browserforge),确认headers\data、fingerprints\data等目录下的JSON文件是程序所需资源。
2. 正确配置auto-py-to-exe的附加文件
在auto-py-to-exe界面操作:
- 切换到Additional Files标签页
- 点击Add Folder,选择browserforge安装目录下的
headers和fingerprints目录 - 设置Destination为
browserforge/,确保资源文件解压后位于临时目录的browserforge子目录下,与程序期望路径匹配
3. 代码中指定资源文件路径
如果GUI添加仍无效,在代码中通过PyInstaller提供的临时目录路径修正加载逻辑:
import sys import os # 获取打包后的临时目录,未打包时取当前脚本目录 base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))) # 拼接browserforge资源根路径 browserforge_root = os.path.join(base_path, 'browserforge') # 若browserforge支持设置资源路径,在此配置(需参考库的API) # 示例: # import browserforge # browserforge.config.set('data_path', browserforge_root)
4. 使用PyInstaller spec文件手动打包(更稳定)
若auto-py-to-exe的GUI配置存在问题,直接编写spec文件控制打包流程:
- 生成基础spec文件:
pyi-makespec main.py
- 编辑
main.spec,在datas列表中添加browserforge资源:
a = Analysis( ['main.py'], datas=[ # 格式:(源文件/目录路径, 打包后目标路径) ('venv/Lib/site-packages/browserforge/headers', 'browserforge/headers'), ('venv/Lib/site-packages/browserforge/fingerprints', 'browserforge/fingerprints'), # 根据需要添加其他资源目录 ], # 其余配置保持默认 ) pyz = PYZ(a.pure, a.zipped_data) exe = EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='main', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, )
- 执行打包命令:
pyinstaller main.spec
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

