cnocr使用pyinstaller打包后报错:Traceback (most recent call last): FileNotFoundError: [Errno 2] No such file or directory: ‘C:\Users\Administrator\AppData\Roaming\cnocr\2.3\densenet_lite_136-gru-onnx.zip’
时间: 2025-07-05 16:39:36 浏览: 9
<think>好的,我现在需要帮助用户解决他们使用PyInstaller打包cnocr后遇到的FileNotFoundError错误。首先,我得仔细分析问题。用户提供的错误信息指出,程序在运行打包后的可执行文件时,找不到位于特定路径下的模型文件:'C:\Users\Administrator\AppData\Roaming\cnocr\2.3\densenet_lite_136-gru-onnx.zip'。
首先,我应该回忆一下PyInstaller的工作原理。PyInstaller会将Python脚本打包成可执行文件,但在运行时,程序的工作目录可能与开发时不同。特别是当程序需要访问外部文件或资源时,这些文件可能没有被正确包含进打包后的可执行文件中,或者路径引用方式不正确。
接下来,我需要了解cnocr库是如何处理模型文件的。通常,像这样的机器学习库会在首次运行时下载预训练模型,并保存到用户目录的某个位置,比如AppData/Roaming下的cnocr文件夹。但如果是打包后的应用,可能无法自动下载或正确访问这些文件,尤其是在没有网络连接或者权限受限的环境下。
用户遇到的错误提示是文件未找到,可能的原因有几个:
1. **模型文件未正确打包进可执行文件**:PyInstaller可能没有自动识别到cnocr依赖的模型文件,导致这些文件没有被包含在最终的打包结果中。因此,当程序运行时,尝试访问这些文件时会失败。
2. **运行时路径问题**:打包后的可执行文件可能在运行时使用不同的工作目录,导致程序无法找到预期的相对路径下的文件。例如,cnocr可能在代码中假设模型文件位于某个固定路径,但打包后的应用可能将该路径指向了错误的目录。
3. **权限或目录创建问题**:应用在运行时可能没有权限在目标目录(如AppData/Roaming)创建或写入文件,导致无法下载或保存模型文件。
接下来,我需要思考如何解决这些问题。可能的解决方案包括:
**解决方案一:将模型文件手动添加到PyInstaller打包中**
用户需要确保模型文件被包含在打包后的可执行文件中。可以使用PyInstaller的`--add-data`参数将模型文件或目录添加到打包结果中。例如,如果模型文件位于Python环境的某个目录中,用户需要找到这些文件的路径,并在打包时指定。例如:
```bash
pyinstaller --add-data "path/to/densenet_lite_136-gru-onnx.zip;cnocr/models" your_script.py
```
但这里可能需要更精确的路径,或者确定模型文件在安装cnocr后的存储位置。用户可能需要查看cnocr的文档,确认模型文件的默认存储路径,然后将这些文件包含到打包中。
**解决方案二:修改代码以适应打包后的路径结构**
在代码中,可能需要动态调整模型文件的加载路径。例如,使用`sys._MEIPASS`来获取PyInstaller打包后的临时解压目录,从而正确引用模型文件。例如:
```python
import sys
import os
if getattr(sys, 'frozen', False):
# 打包后的路径
base_path = sys._MEIPASS
else:
# 普通运行时的路径
base_path = os.path.dirname(__file__)
model_path = os.path.join(base_path, 'cnocr', 'models', 'densenet_lite_136-gru-onnx.zip')
```
然后在初始化cnocr的模型时,指定模型路径。例如,使用`CnOcr`时传入`model_fp`参数:
```python
from cnocr import CnOcr
ocr = CnOcr(model_fp=model_path)
```
这需要用户修改他们的代码,确保在打包后能正确找到模型文件的位置。
**解决方案三:确保运行时目录结构正确**
用户可能需要确保在打包后的可执行文件旁边存在正确的目录结构,例如包含`cnocr`目录及其子目录和模型文件。这可能需要手动复制相关文件到打包后的目录中,或者在打包时通过PyInstaller的配置自动包含这些文件。
**解决方案四:处理首次运行时的模型下载**
如果cnocr在首次运行时自动下载模型文件,但打包后的应用无法执行下载操作(例如由于权限问题或路径问题),可能需要预先下载模型文件,并将其包含在打包中。用户可以在开发环境中运行一次程序,让cnocr下载所需的模型文件,然后将这些文件添加到PyInstaller的数据文件中。
此外,用户可能需要检查在打包后的环境中,应用是否有权限在`AppData/Roaming`目录下创建文件和目录。如果权限不足,可能需要以管理员权限运行,或者修改代码将模型文件存储在用户有写权限的目录中。
可能的验证步骤包括:
1. 确认在未打包的情况下,应用能正常运行并正确下载或访问模型文件。
2. 使用PyInstaller打包时,明确添加所有必要的模型文件和数据。
3. 在打包后的目录中手动检查是否包含所需的模型文件。
4. 在运行时使用调试信息输出当前工作目录和模型文件路径,确认路径是否正确。
另外,可能需要查阅cnocr的官方文档或GitHub仓库的Issue部分,看看是否有其他用户遇到类似问题,以及官方推荐的解决方案。例如,某些库可能需要特定的PyInstaller钩子(hooks)来处理数据文件或动态导入的模块。
总结来说,这个问题的核心在于PyInstaller没有正确打包cnocr所需的模型文件,或者在运行时路径不正确导致无法找到这些文件。解决方法需要确保模型文件被正确包含,并且代码中引用的路径适应打包后的环境。</think>### 分步解决方案
遇到`cnocr`用PyInstaller打包后报文件缺失的问题,主要原因是模型文件未被正确打包或路径引用错误。以下是详细解决步骤:
---
#### **第一步:定位模型文件路径**
1. **开发环境测试**
在开发环境中运行你的代码,确保首次运行后`cnocr`已自动下载模型文件到默认路径:
`C:\Users\<用户名>\AppData\Roaming\cnocr\<版本号>\`
记下此路径中的具体文件(如`densenet_lite_136-gru-onnx.zip`)。
---
#### **第二步:将模型文件加入PyInstaller打包**
1. **使用`--add-data`参数**
打包时需手动添加模型文件。假设模型文件在开发环境的默认路径下,执行命令:
```bash
pyinstaller --add-data "C:\Users\Administrator\AppData\Roaming\cnocr\2.3\densenet_lite_136-gru-onnx.zip;cnocr\2.3\" your_script.py
```
- 分号前是本地文件路径,分号后是打包后的相对路径(需与代码中读取路径一致)。
---
#### **第三步:修改代码以适配打包路径**
1. **动态获取模型路径**
修改代码,使用`sys._MEIPASS`获取PyInstaller临时解压路径:
```python
import sys
import os
from cnocr import CnOcr
def get_resource_path(relative_path):
if getattr(sys, 'frozen', False): # 判断是否为打包环境
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
model_path = get_resource_path("cnocr/2.3/densenet_lite_136-gru-onnx.zip")
ocr = CnOcr(model_fp=model_path) # 显式指定模型路径
```
---
#### **第四步:验证打包后的目录结构**
1. **检查生成文件**
打包完成后,查看生成的`dist`文件夹,确认其中包含:
```
dist/your_script/
your_script.exe
cnocr/
2.3/
densenet_lite_136-gru-onnx.zip
```
若目录结构不符,调整`--add-data`参数中的目标路径。
---
#### **第五步:处理首次运行时的路径创建**
1. **确保目录可写**
如果`cnocr`仍需向`AppData/Roaming`写入文件,在代码中捕获异常并重定向路径:
```python
from pathlib import Path
# 自定义模型目录(例如打包后的同级目录)
custom_model_dir = Path(__file__).parent / "cnocr_models"
custom_model_dir.mkdir(exist_ok=True)
# 初始化OCR时指定目录
ocr = CnOcr(model_dir=str(custom_model_dir))
```
---
#### **第六步:重新打包并测试**
1. **执行打包命令**
整合所有修改后重新运行PyInstaller命令,生成新的可执行文件。
2. **测试运行**
在无Python环境的机器上运行打包后的程序,观察是否报错。
---
### 常见问题补充
- **权限问题**:若程序需写入系统目录(如`AppData`),尝试以管理员身份运行。
- **网络问题**:若需在线下载模型,确保打包后的程序有网络权限。
- **版本兼容性**:确认`cnocr`与`PyInstaller`版本兼容,必要时查阅官方文档或社区反馈。
通过以上步骤,应能解决模型文件缺失导致的报错问题。
阅读全文
相关推荐


















