py3.6使用pyinstaller打包执行时报错FileNotFoundError:No such file or directory

参考链接:
1、https://blog.youkuaiyun.com/pipisorry/article/details/50620495
2、https://pythonhosted.org/PyInstaller/spec-files.html#adding-data-files

在py3.6使用pyinstaller打包时很顺利,但是在执行exe文件时报错:

FileNotFoundError: [Errno 2] No such file or directory: 'logging.json'
[5648] Failed to execute script agent

因为出错的这个文件恰恰不是py文件,也不是其他,而是配置文件,一开始并没有想到这是数据文件,但我觉得肯定是因为这个文件类型不同的原因。

解决办法有两个:
1、最简单的就是将跟.json相关的文件放到dist目录下(生成的exe在dist目录下,并且要使用exe时,要挪动一整个dist目录),执行就OK了。

2、打开.spec文件,里面 有一个

a = Analysis(['your_py.py'],
             pathex=['your_py_path'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
    
<think>嗯,用户在使用PyInstaller打包cnocr遇到了FileNotFoundError,具体是找不到densenet_lite_136-gru-onnx.zip这个文件。我需要帮他解决这个问题。根据用户提供的引用内容,特别是引用[2]和[5],这个问题通常是因为打包缺少数据文件或第三方库的资源。 首先,用户提到错误是关于一个zip文件的缺失。这可能是因为cnocr在运行需要加载这个预训练模型文件,而PyInstaller默认不会包含这些数据文件。我需要检查cnocr的文档,确认这个文件的位置以及程序是如何访问它的。如果程序使用相对路径或者依赖于某个特定的目录结构,打包后路径可能会改变,导致找不到文件。 根据引用[2],当第三方包需要额外的数据文件,可能需要手动添加hook或者使用--add-data参数来包含这些文件。例如,用户之前处理过cpca包的问题,通过手动hook解决。类似地,这里可能需要将densenet_lite_136-gru-onnx.zip添加到打包命令中。另外,引用[4]中提到了使用--add-binary来添加动态库,可能类似的方法适用于数据文件,但需要确认是使用--add-data还是--add-binary。 另外,引用[5]提到打包后__file__失效的问题,导致路径错误。可能需要修改代码,使用sys._MEIPASS来正确获取资源路径。例如,在代码中检测是否处于打包环境,如果是,则调整文件路径指向临解压的目录。 步骤应该是: 1. 确定densenet_lite_136-gru-onnx.zip在系统中的位置。可能是在cnocr的安装目录下,比如site-packages/cnocr/...或者用户目录下的某个缓存位置。 2. 使用PyInstaller的--add-data参数将源文件路径映射到目标目录。例如,--add-data "path/to/densenet_lite_136-gru-onnx.zip;cnocr/resources"。 3. 修改代码,在访问该文件使用sys._MEIPASS来构建正确的路径。例如,在加载模型,检查是否被打包,如果是,则从sys._MEIPASS获取基础路径。 4. 如果cnocr有已知的hook文件,可以尝试创建或使用现有的hook,但用户可能需要手动处理,特别是如果这个文件是动态下载或存放在特定位置的话。 5. 测试打包后的exe,确保文件被正确包含,并且路径访问正确。 此外,用户可能需要清理构建缓存,使用--clean选项重新打包,避免旧文件干扰。还有,检查是否还有其他依赖文件缺失,比如其他模型文件或配置文件,确保它们都被正确包含进去。 总结下来,解决方案应该包括修改打包命令添加缺失文件,调整代码中的路径处理,以及可能的hook配置。同,参考用户提供的引用中的类似处理方法,特别是引用[2]和[4]的经验。</think>### 解决cnocr打包FileNotFoundError问题的分步方案 #### 问题分析 在PyInstaller打包cnocr出现`FileNotFoundError: densenet_lite_136-gru-onnx.zip`,原因是**模型文件未被正确打包到可执行程序中**。cnocr依赖的ONNX模型文件默认存储在用户缓存目录(如`~/.cnocr`)或库路径中,但PyInstaller不会自动包含这些外部文件[^2][^5]。 --- #### 解决方案 ##### 1. **手动添加模型文件到打包命令** 通过`--add-data`参数将模型文件显式包含到可执行程序中: ```bash pyinstaller --add-data "C:/Users/你的用户名/.cnocr/*;.cnocr/" --add-data "path/to/densenet_lite_136-gru-onnx.zip;." --onefile your_script.py ``` - **路径说明**: - `C:/Users/你的用户名/.cnocr/*`:模型默认缓存目录(需替换实际路径) - `path/to/densenet_lite_136-gru-onnx.zip`:通过`pip show cnocr`查找库安装路径中的文件 - 分号后的`.`表示打包后文件位于程序根目录[^4] --- ##### 2. **修改代码适配打包环境** 在代码中添加路径动态修正逻辑,处理打包后的资源路径: ```python import sys import os from cnocr import CnOcr def get_resource_path(relative_path): """ 适配PyInstaller解压目录 """ if hasattr(sys, &#39;_MEIPASS&#39;): return os.path.join(sys._MEIPASS, relative_path) return os.path.join(os.path.abspATH("."), relative_path) # 初始化OCR指定模型路径 ocr = CnOcr( model_name=&#39;densenet_lite_136-gru&#39;, model_fp=get_resource_path(&#39;densenet_lite_136-gru-onnx.zip&#39;) ) ``` --- ##### 3. **验证文件包含情况** 通过以下命令检查打包文件是否包含目标资源: ```bash pyinstaller --log-level DEBUG your_script.py 2> build.log grep "densenet_lite_136-gru" build.log ``` 若未找到记录,需检查`--add-data`路径格式(Windows用分号`;`,Linux/macOS用冒号`:`)[^3] --- ##### 4. **清理构建缓存(重要)** 每次修改打包参数后执行: ```bash pyinstaller --clean --onefile your_script.py ``` --- #### 补充优化 - **缩小体积**:使用`pipenv`创建虚拟环境,仅安装必要依赖 - **GPU支持**:若使用ONNX GPU版本,需额外添加CUDA动态库 ```bash --add-binary "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.2/bin/*.dll;./" ``` --- #### 典型错误处理 | 错误现象 | 解决方案 | |---------|---------| | `ModuleNotFoundError` | 检查是否遗漏`hiddenimports`参数 | | `__file__`路径失效[^5] | 改用`sys._MEIPASS`获取基础路径 | | 多进程崩溃 | 添加`--multiprocessing-fork`参数 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值