我遇到了问题,因为我对Python并不是很了解,我会感谢别人的帮助,帮助我理解我的问题。
我正在建造便携式无线电台。 Raspberry Pi利用Pianobar前往Pandora服务器,登录我的帐户,获取我的电台,然后开始播放第一个。
我正在关注Adafruit官方指南:https://learn.adafruit.com/pi-wifi-radio/overview
我一直跟着指南一直到Pianobar工作。我可以从命令行运行“pianobar”。它可以在不到10秒的时间内连接并开始播放音乐。
但是,当我启动允许16x2 LCD键盘与pianobar连接的脚本时,它不起作用。
更具体地说,它通过了脚本的前半部分。液晶显示屏显示IP地址并显示“检索电台列表...”。 10秒后,脚本会退出所有这些。
pi@pandora ~/Python-WiFi-Radio $ sudo python PiPhi.py
Spawning pianobar...
Receiving station list...
Traceback (most recent call last):
File "PiPhi.py", line 288, in <module>
stationList, stationIDs = getStations()
File "PiPhi.py", line 190, in getStations
pianobar.expect('Select station: ', timeout=10)
File "/usr/local/lib/python2.7/dist-packages/pexpect.py", line 1311, in expect
return self.expect_list(compiled_pattern_list, timeout, searchwindowsize)
File "/usr/local/lib/python2.7/dist-packages/pexpect.py", line 1325, in expect_list
return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize)
File "/usr/local/lib/python2.7/dist-packages/pexpect.py", line 1409, in expect_loop
raise TIMEOUT (str(e) + '\n' + str(self))
pexpect.TIMEOUT: Timeout exceeded in read_nonblocking().
<pexpect.spawn object at 0xb6b305b0>
version: 2.3 ($Revision: 399 $)
command: /usr/bin/sudo
args: ['/usr/bin/sudo', '-u', 'pi', 'pianobar']
searcher: searcher_re:
0: re.compile("Select station: ")
TIME: -03:35/03:43
TIME: -03:35/03:43
after: <class 'pexpect.TIMEOUT'>
match: None
match_index: None
exitstatus: None
flag_eof: False
pid: 2315
child_fd: 5
closed: False
timeout: 30
delimiter: <class 'pexpect.EOF'>
logfile: None
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1
pi@pandora ~/Python-WiFi-Radio $
http://pastebin.com/6Lm3dTwx - 这是我试图跑的脚本
从我的基本知识来看,它看起来比检索电台列表的超时时间更长。因为我完全迷失了,请帮助我。谢谢!
答案 0 :(得分:0)
我遇到了同样的问题,对于低技术修复,我只是在启动脚本中将谷歌搞砸了10次。这使系统足够长,可以使网络连接稳定。
答案 1 :(得分:0)
我发现用户ID“pi”在PiPhi.py中是硬编码的!更改 第33行(PICKLEFILE),286(pepect.spawn('sudo -u pi ... 解决了我的问题..
希望这会有所帮助..
答案 2 :(得分:0)
这里可能存在两个问题。我很难产生这个过程。这在pianobar.excect中显示为EOF错误,用于&#39;获取电台...确定。\ r \ n&#39;。要查看发生了什么,请处理EOF异常并打印pianobar.before:
# Launch pianobar as pi user (to use same config data, etc.) in background:
print('Spawning pianobar...')
pianobar = pexpect.spawn('sudo -u pi /home/pi/pianobar/pianobar', timeout=60)
print('Receiving station list...')
expectIdx = pianobar.expect(['Get stations... Ok.\r\n', pexpect.EOF, pexpect.TIMEOUT])
if expectIdx == 0:
stationList, stationIDs = getStations()
try: # Use station name from last session
stationNum = stationList.index(defaultStation)
except: # Use first station in list
stationNum = 0
print 'Selecting station ' + stationIDs[stationNum]
pianobar.sendline(stationIDs[stationNum])
elif expectIdx == 1: # EOF
print 'pianobar.expect EOF error'
print pianobar.before # shows response from pianobar spawn
pianobar.kill(0)
elif expectIdx == 2: # TIMEOUT
print 'pianobar.expect TIMEOUT error'
pianobar.kill(0)
&#13;
我通过指定pianobar的完整路径来修复我的问题(如上所示)。
第二个问题可能是因为您在pianobar配置中有一个有效的默认工作站。如果是这种情况,启动时不会显示选择站列表,您需要请求它。此错误显示在getStations()中的pianobar.expect上。如果初始请求超时,我通过请求站列表来修复此问题:
expectIdx = pianobar.expect(['Select station: ', pexpect.EOF, pexpect.TIMEOUT], timeout=10)
if expectIdx == 1: # EOF
print 'pianobar.expect EOF error at getStations'
print pianobar.before # shows response from pianobar spawn
pianobar.kill(0)
elif expectIdx == 2: # TIMEOUT
# try requesting the station list
pianobar.send('s')
pianobar.expect('Select station', timeout=10)
&#13;
答案 3 :(得分:0)
我知道这已经过时了,但我刚刚遇到了这个问题。我发现发出以下命令:
pianobar.send('s')
之前
pianobar.expect('Select station: ', timeout=20)
强制pianobar更新电台列表