You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV代码Ubuntu 18.04正常,树莓派3 Raspbian运行报错求助

解决树莓派Raspbian中os.path.join与pathlib.Path的类型兼容问题

这个问题我碰到过,本质是Python版本兼容性导致的——你的树莓派用的是Python 3.5,而Ubuntu应该是3.6及以上的版本,这两个版本对pathlib.Path和os.path.join的兼容性处理不一样。

错误原因分析

Traceback (most recent call last): File "RPi_deneme.py", line 201, in cv2.imwrite(os.path.join(cikisklasoru, img_name), Frame) File "/home/pi/.virtualenvs/cv/lib/python3.5/posixpath.py", line 89, in join genericpath._check_arg_types('join', a, *p) File "/home/pi/.virtualenvs/cv/lib/python3.5/genericpath.py", line 143, in _check_arg_types (funcname, s.class.name)) from None TypeError: join() argument must be str or bytes, not 'PosixPath'

在Python 3.5中,os.path.join只接受字符串或字节类型的参数,但你传入了pathlib.Path生成的PosixPath对象(也就是变量cikisklasoru),所以触发了类型错误。而Python 3.6及以后的版本,官方已经优化了os.path.join的参数支持,允许直接传入Path对象,这就是为什么你的代码在Ubuntu上能正常运行的原因。

三种修复方案

  • 方案1:将Path对象转为字符串
    最简单的修改方式是把cikisklasoru用str()包裹,转换成os.path.join能识别的字符串类型:

    cv2.imwrite(os.path.join(str(cikisklasoru), img_name), Frame)
    

    这种改动最小,不需要调整其他代码逻辑。

  • 方案2:全程使用pathlib的路径拼接
    既然你已经用了pathlib.Path来创建带时间戳的文件夹,不如统一用pathlib的语法来拼接路径(用/操作符),再转成字符串传给cv2.imwrite:

    # 用pathlib拼接路径
    save_path = cikisklasoru / img_name
    # 转成字符串后写入
    cv2.imwrite(str(save_path), Frame)
    

    这种方式更贴合pathlib的设计思路,也能避免os模块和pathlib的类型冲突。

  • 方案3:升级Python版本(可选)
    如果你的树莓派环境允许,可以把Python版本升级到3.6及以上。升级后os.path.join就能直接接受Path对象,不需要修改现有代码。不过树莓派系统升级Python可能涉及依赖调整,操作前建议备份环境。

修改后在树莓派上测试,应该就能正常将抓拍图片保存到对应时间戳的文件夹里了。

内容的提问来源于stack exchange,提问作者Konrul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:22:56