Thonny正常运行的Python脚本在树莓派终端执行失败问题求解
排查思路
无sudo运行报AttributeError问题
- 先加调试代码确认输出内容:在
devices = data.split('},')之后,遍历每个i时先打印print(repr(i)),查看实际拿到的tuya-cli输出是否包含预期的name:、id:、key:字段。普通用户运行时大概率tuya-cli输出中混杂了权限报错、配置缺失提示,导致正则匹配不到内容返回None。 - 优化正则容错性:将正则规则调整为
re.search(r"name:\s*['\"](.*?)['\"]", str(i)),兼容单双引号、字段前后的空格差异;同时增加非空判断,确认匹配到结果后再调用group()方法,避免直接崩溃。 - 检查tuya-cli配置权限:普通用户运行时读取的是
/home/pi/.tuya/下的配置文件,确认该目录及文件对pi用户可读,无权限不足问题。
加sudo运行报pexpect超时问题
- 从报错的buffer内容可以直接定位问题:当前tuya-cli已经输出了交互式提示
The API key from tuya.com:,等待用户输入,但你的代码中expect匹配的是\r\n(换行符),而交互式输入提示的末尾默认没有换行符,因此永远匹配不到触发超时。 - 调整expect匹配规则:不要匹配换行,改为匹配实际的交互提示文本,例如第一步如果是确认继续的提示,就匹配对应的关键词,比如
child.expect('Do you want to continue.*'),再发送y;后续匹配child.expect('The API key from tuya.com:')之后再发送你的密钥,完全按照实际手动运行sudo tuya-cli wizard的交互流程调整匹配逻辑即可。 - 检查root用户下的tuya-cli状态:sudo运行时切换到了root用户,root家目录下没有tuya-cli的缓存配置,因此会从头走向导流程,和普通用户已经配置过的流程不一样,需要先手动跑一次
sudo tuya-cli wizard确认完整的交互步骤,再对应修改代码。 - 可选优化:给expect方法增加超时参数
child.expect(xxx, timeout=120),避免网络拉取设备信息时超时;开启pexpect日志child.logfile = open('/tmp/tuya_debug.log', 'wb'),可以完整记录所有交互输出,方便后续排查。
内容的提问来源于stack exchange,提问作者Mizuna
相关产品推荐
相关产品推荐

