Python:在循环中更新

时间:2017-05-05 10:30:12

标签: python api while-loop

所以我试图通过Volumio的REST API创建一个与音乐服务器Volumio交互的小程序(文档在这里:https://volumio.github.io/docs/API/REST_API.html)。基本上,我的程序应该将命令作为输入,将其转换为REST API请求,发送请求,并打印出歌曲的状态和标题。我知道在这里输入无效命令的空间,但目前我不关心。我担心的是输入命令后的输出是错误的。这是代码:

import json
import requests

def controls(cmd):
        volumio = requests.get("http://volumio.local:3000/api/v1/getstate")
        vol_data = volumio.text
        py_data = json.loads(vol_data)
        if cmd == 'getstate':
                 print(py_data['title'], py_data['status'])
        else:
                requests.get("http://volumio.local:3000/api/v1/commands/?cmd=%s" % cmd)
                print(py_data['title'], py_data['status'])
while True:
        input = raw_input('Command: ')
        controls(input)

基本上,在提交命令'pause'之后,输出应为:

(u'04 - The Woods.mp3', u'pause')

然后'再次'播放:

(u'04 - The Woods.mp3', u'play')

'next'应该只是更改歌曲名称并保持状态相同。但是当我跑步时,这是我的输出:

Command: play
(u'04 - The Woods.mp3', u'pause')
Command: play
(u'04 - The Woods.mp3', u'play') #showing the state from line 1 command
Command: getstate
(u'04 - The Woods.mp3', u'play') #shows correct updated state
Command: next
(u'04 - The Woods.mp3', u'play') #showing wrong song title
Command: getstate
(u'A.T.A.B.', u'play') #updated and showing correct song title from line 7
Command: pause
(u'A.T.A.B.', u'play')
Command: play 
(u'A.T.A.B.', u'pause')
Command: 

我的输出似乎落后一个周期,我无法弄清楚原因。

2 个答案:

答案 0 :(得分:1)

因为您已经在脚本中对它进行了排序。您始终调用getstate端点,该端点显示您执行的最后一个命令,并将该结果解析为py_data。现在,如果您输入实际命令,也会发送该命令,但随后输出py_data的内容 - 您尚未更新。

假设发送命令的结果是当前状态,您应该在else块中对该结果调用json.loads,并打印出来。

编辑好的,这是一个更有意义的重新制定的功能。

def controls(cmd):
    if cmd != 'getstate':
        requests.get("http://volumio.local:3000/api/v1/commands/?cmd=%s" % cmd)
    volumio = requests.get("http://volumio.local:3000/api/v1/getstate")
    vol_data = volumio.text
    py_data = json.loads(vol_data)
    print(py_data['title'], py_data['status'])

如果有的话,执行命令,然后执行getstate调用。

答案 1 :(得分:1)

def controls(cmd):
    volumio = requests.get("http://volumio.local:3000/api/v1/getstate")
    vol_data = volumio.text
    py_data = json.loads(vol_data)
    if cmd == 'getstate':
             print(py_data['title'], py_data['status'])
    else:
            r = requests.get("http://volumio.local:3000/api/v1/commands/?cmd=%s" % cmd)
            py_data = r.json()
            print(py_data['title'], py_data['status'])