为Google Home编写TTS脚本时遭遇AttributeError错误的解决求助
解决Google Home TTS脚本的AttributeError问题
嘿,我懂你现在卡在哪了——给Google Home写TTS脚本时碰到了AttributeError: 'list' object has no attribute 'device'的报错,我来帮你捋清楚怎么修复这个问题。
问题根源
这个错误其实是在告诉你:你遍历的列表里,某个元素本身是个列表,而不是你预期的Chromecast设备对象,所以当你试图访问它的device属性时自然就报错了。大概率是pychromecast.get_chromecasts()的返回值结构和你想的不一样:
- 旧版本的
pychromecast里,这个方法直接返回设备对象的列表; - 新版本里它返回的是一个
CastBrowser实例,真正的设备列表藏在它的devices属性里; - 少数情况下,还可能返回嵌套的列表结构,导致遍历到子列表时出错。
修复代码
这里给你两种针对性的修复方案,你可以根据自己的pychromecast版本来选:
方案1:适配新版本pychromecast(推荐)
如果你的pychromecast版本是10.0及以上,修改获取设备列表的代码:
# 获取CastBrowser对象,再从中提取设备列表 browser = pychromecast.get_chromecasts() CastDevice = browser.devices # 找到目标设备,同时处理找不到设备的情况 cast = next((cc for cc in CastDevice if cc.device.friendly_name == 'Rum'), None) if not cast: print("找不到名为'Rum'的Google Home设备,请检查设备名称是否正确") exit() cast.wait() media = cast.media_controller media.play_media(r.url, content_type='audio/mp3') media.block_until_active() media.play()
方案2:处理嵌套列表的情况
如果你的get_chromecasts()返回的是嵌套列表,先把它扁平化:
CastDevice = pychromecast.get_chromecasts() # 扁平化列表,确保每个元素都是设备对象 flat_devices = [] for item in CastDevice: if isinstance(item, list): flat_devices.extend(item) else: flat_devices.append(item) # 查找目标设备 cast = next((cc for cc in flat_devices if cc.device.friendly_name == 'Rum'), None) if not cast: print("找不到名为'Rum'的设备") exit() cast.wait() media = cast.media_controller media.play_media(r.url, content_type='audio/mp3') media.block_until_active() media.play()
额外提示
- 先确认你的Google Home设备名称确实是
'Rum',大小写要完全匹配; - 运行脚本前,确保电脑和Google Home在同一个局域网里;
- 可以先打印
CastDevice的内容,看看它的结构到底是什么,方便排查问题:print(CastDevice)
内容的提问来源于stack exchange,提问作者NaWa
相关产品推荐
相关产品推荐

