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())。
- 检查该函数是否因Python2/3的API差异导致返回
- 增加空值与长度校验:避免直接对可能为
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
相关产品推荐
相关产品推荐

