【踩坑】修复报错 Unable to load from type <class pathlib.WindowsPath>

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn]

如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~

问题描述

在使用cnocr调用onnxruntime时候遇到报错:

File "C:\Users\Administrator\AppData\Local\Programs\Python\Python310\lib\site-packages\rapidocr\inference_engine\onnxruntime\main.py", line 62, in __init__ self.session = InferenceSession( File "C:\Users\Administrator\AppData\Local\Programs\Python\Python310\lib\site-packages\onnxruntime\capi\onnxruntime_inference_collection.py", line 349, in __init__ raise TypeError("Unable to load from type '{0}'".format(type(path_or_bytes))) TypeError: Unable to load from type '<class 'pathlib.WindowsPath'>'

问题的关键在于 onnxruntime 无法处理 pathlib.WindowsPath 类型的路径,而 cnocr 或 rapidocr 在传递模型路径时使用了这种类型。

解决方案

如果能接触到源码,就直接手动转换:

from cnocr import CnOcr
from pathlib import Path

# 获取模型路径并转换为字符串
model_path = str(Path("xxx/ch_PP-OCRv5_det_infer.onnx"))

如果不想改源码,就打个补丁(推荐):

import onnxruntime
import pathlib

# 保存原始的 InferenceSession
_orig_InferenceSession = onnxruntime.InferenceSession

# 创建包装函数
def _patched_InferenceSession(path_or_bytes, *args, **kwargs):
    if isinstance(path_or_bytes, pathlib.Path):
        path_or_bytes = str(path_or_bytes)
    return _orig_InferenceSession(path_or_bytes, *args, **kwargs)

# 打补丁
onnxruntime.InferenceSession = _patched_InferenceSession

# 现在导入 cnocr 应该正常工作
from cnocr import CnOcr

这是我使用阿里云创建出来的springboot,为什么显示repackage报错 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xzit</groupId> <artifactId>createAli_1</artifactId> <version>0.0.1-SNAPSHOT</version> <name>createAli_1</name> <description>createAli_1</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.6.13</spring-boot.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <configuration> <mainClass>com.xzit.CreateAli1Application</mainClass> <skip>true</skip> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
最新发布
03-11
<think>嗯,用户在使用阿里云创建的Spring Boot项目时遇到了repackage报错。首先,我需要看一下他们提供的pom.xml文件,找出可能的问题所在。 看到pom.xml中的Spring Boot Maven插件配置,版本是${spring-boot.version},而spring-boot.version被设置为2.6.13。通常这个版本应该是没问题的,但可能插件版本和Spring Boot版本不兼容?或者配置有误。 注意到插件配置里有一个<skip>true</skip>,这个参数如果设置为true的话,会跳过repackage步骤,导致打包失败,因为可能生成了原始的jar但没有重新打包成可执行的jar。用户可能在这里设置了skip,导致目标文件不存在,从而报错。 另外,检查executions部分,repackage的执行是否正确配置。用户这里配置了execution,但如果有其他插件或者配置冲突,也可能导致问题。不过用户的execution看起来是标准的,应该没问题。 还有可能是主类com.xzit.CreateAli1Application的路径是否正确,如果主类不存在或者路径错误,repackage时也会失败。需要确认应用程序主类的包路径是否与pom中的配置一致。 另外,Maven版本是否兼容?用户用的maven-compiler-plugin是3.8.1,可能没问题,但最好确认一下Maven本身的版本是否支持这些插件版本。 解决方案方面,首先建议用户将<skip>true</skip>改为false或者直接移除这个配置,因为默认是false。这样repackage步骤就不会被跳过,应该能正确生成可执行jar。 如果主类路径错误,需要修正mainClass的配置。同时,检查项目结构,确保主类存在于指定位置。 另外,可以尝试明确指定Spring Boot Maven插件的版本,而不是使用变量,有时候变量解析可能有问题。或者检查是否有其他依赖冲突,导致插件执行失败。 用户可能不太清楚repackage的作用,可以解释一下这个插件的作用是重新打包成包含所有依赖的可执行jar,而跳过这一步会导致找不到主类或者无法运行。 总结来说,最可能的错误点就是<skip>true</skip>导致插件跳过了repackage,从而报错。需要移除该配置或者设为false,然后重新打包测试。</think>您遇到的`repackage`报错通常与Spring Boot Maven插件配置相关。根据您提供的`pom.xml`,以下是逐步排查和解决方案: --- ### 一、直接原因分析 **问题核心在于配置冲突**: 在`spring-boot-maven-plugin`插件中,您同时配置了`<skip>true</skip>`和`repackage`目标,这会导致以下矛盾: 1. `<skip>true</skip>`表示**跳过插件执行** 2. `<execution>`中又强制绑定了`repackage`目标 两者冲突会导致Maven尝试执行被跳过的任务,从而报错。 --- ### 二、解决方案 #### 方案1:移除`<skip>`配置(推荐) 直接删除`<skip>true</skip>`,保持默认的`false`状态: ```xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <configuration> <mainClass>com.xzit.CreateAli1Application</mainClass> <!-- 删除或注释此行 --> <!-- <skip>true</skip> --> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> ``` #### 方案2:动态控制`skip`参数(可选) 若需保留跳过逻辑,可通过Maven命令行参数动态控制: ```bash mvn package -Dspring-boot.repackage.skip=true ``` --- ### 三、辅助验证步骤 #### 1. 检查主类路径 确保`<mainClass>`配置的`com.xzit.CreateAli1Application`实际存在,且路径为: ``` src/main/java/com/xzit/CreateAli1Application.java ``` #### 2. 验证Maven命令 执行以下命令清理并重新构建: ```bash mvn clean package -U ``` #### 3. 检查插件版本兼容性 您的配置中: - Spring Boot版本为`2.6.13` - `spring-boot-maven-plugin`版本通过`${spring-boot.version}`继承,理论上兼容 如果仍报错,可尝试显式指定插件版本: ```xml <version>2.6.13</version> ``` --- ### 四、典型错误日志分析 若问题未解决,请检查报错日志中的关键信息: 1. `Unable to find main class`:主类路径错误 2. `Failed to execute goal repackage`:插件执行失败(通常是配置或依赖冲突) 3. `File ...xxx.jar does not exist`:打包产物未生成(通常因`skip`导致) --- ### 五、技术原理补充 `spring-boot-maven-plugin`的`repackage`目标作用: 1. 将Maven生成的原始JAR(`xxx.jar`)重命名为`xxx.jar.original` 2. 创建一个新的可执行JAR(`xxx.jar`),包含所有依赖 3. 若`skip=true`,则跳过此过程,导致最终产物缺失 --- 请按上述方案调整后重新构建,如果仍有问题,可提供完整错误日志进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小锋学长生活大爆炸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值