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

Python2脚本在Python3运行报错:'NoneType'对象不可下标访问求助

Python2到Python3迁移报错:'NoneType' object is not subscriptable 解决思路

原Python脚本片段

if (enviar_ftp(mounted_usb) >= 0):  # ML: enviar_ftp()->enviar_ftp(ser)
    # Se agrega la captura de schedule online
    s = get_schedule_online(get_id())
    log("Programa en servidor: {0}".format(s))
    if (s != ""):
        save_programa(s)
    enviar_situacion(get_id(), get_programa(), get_free_space()[3], 0, 0, str(100-int(get_free_space()[4])), battery_status(voltaje), voltaje, 0, 0)
    # ser_write("<txt>
")
else:
    log('enviar_ftp() failed')  # ser_write("<txn>
")

报错信息

Traceback (most recent call last):
  File "/home/pi/main.py", line 511, in <module>
    app_main()
  File "/home/pi/main.py", line 499, in app_main
    send_pics()
  File "/home/pi/main.py", line 241, in send_pics
    enviar_situacion(get_id(), get_programa(), get_free_space()[3], 0, 0, str(100-int(get_free_space()[4])), battery_status(voltaje), voltaje, 0, 0)
TypeError: 'NoneType' object is not subscriptable

解决思路

  • 定位核心问题:报错明确指向get_free_space()[3]和get_free_space()[4],说明get_free_space()函数在Python3中返回了None,但Python2中返回了可通过下标访问的对象(如列表、元组)。
  • 排查get_free_space()实现:
    • 检查该函数是否因Python2/3的API差异导致返回None。比如调用系统命令(如df)时,Python3的subprocess模块返回字节串,若未解码为字符串会导致解析失败;或是使用了Python2专属的函数处理逻辑未适配Python3。
    • 在调用get_free_space()前添加调试代码,打印返回值确认:print("get_free_space 返回值:", get_free_space())。
  • 增加空值与长度校验:避免直接对可能为None的结果做下标访问,修改代码逻辑:
    if (enviar_ftp(mounted_usb) >= 0):
        s = get_schedule_online(get_id())
        log("Programa en servidor: {0}".format(s))
        if (s != ""):
            save_programa(s)
        # 先获取并校验磁盘空间数据
        free_space_data = get_free_space()
        if free_space_data is not None and len(free_space_data) >= 5:
            # 数据有效时调用enviar_situacion
            enviar_situacion(
                get_id(), 
                get_programa(), 
                free_space_data[3], 
                0, 
                0, 
                str(100 - int(free_space_data[4])), 
                battery_status(voltaje), 
                voltaje, 
                0, 
                0
            )
        else:
            log("get_free_space() 返回无效数据: {}".format(free_space_data))
        # ser_write("<txt>
    

")
else:
log('enviar_ftp() failed')

- **适配Python2到Python3的差异**:
- 若`get_free_space()`依赖系统命令输出,确保在Python3中把字节串解码为字符串,比如`subprocess.check_output(cmd).decode('utf-8')`。
- 检查函数中是否存在Python2专属语法(如`print`语句而非函数、`xrange`等),替换为Python3兼容写法。
- **校验其他依赖函数**:顺带确认`get_id()`、`get_programa()`、`battery_status(voltaje)`等函数在Python3中是否返回预期值,避免后续出现类似问题。

内容的提问来源于stack exchange,提问作者Juan Jullian
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:50:33