2017-05-05 72 views
-1

所以我試圖創建一個通過Volumio的REST API(文檔在這裏:https://volumio.github.io/docs/API/REST_API.html)與音樂服務器Volumio交互的小程序。基本上,我的程序應該將命令作爲輸入,將其翻譯爲REST API請求,發送請求並打印出歌曲的狀態和標題。我承認在這裏輸入一個無效的命令是有空間的,但目前它不是我關心的問題。我擔心輸入命令後的輸出是錯誤的。下面是代碼:Python:在循環內更新

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) 

基本上,提交例如命令 '暫停' 後,輸出應該是:

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

然後在「再次play'ing:

(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: 

我的輸出似乎是一個循環的背後,我想不通爲什麼。

+0

嗨,因爲你正在讀取第二個requests.get()之前設置的py_data。從第二個requests.get的結果被扔掉,因爲沒有變量分配返回值 – Nick

回答

1

因爲這就是您在腳本中訂購它的方式。您始終調用getstate端點,該端點顯示您執行的最後一個命令,並將該結果解析爲py_data。現在,如果您輸入了實際的命令,則也會發送該命令,但是會輸出py_data的內容 - 您尚未更新該內容。

假設發送命令的結果是當前狀態,您應該調用json.loads作爲else塊中的結果,並打印該結果。

編輯好的,這是一個重新配置的函數,更有意義。

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調用。

+0

嗯..實際上,第二個requests.get()(發出命令的那個)不會返回任何數據。至少沒有任何有用的數據。也許我不應該使用requests.get(),因爲我只是用這行發出命令。請requests.post()更常規(即使我不推動任何額外的數據)?除此之外,我不明白爲什麼py_data沒有更新。即使在將getstate請求移動到命令請求下方之後。 –

+0

這不是get或post是更傳統的問題,而是api預期的問題。不過,通常你會使用post來進行狀態更改。請注意,我已經用一些建議的代碼更新了答案。 –

+0

是的,我已經將我的代碼更改爲類似於您的建議(我認爲)的東西......發佈這裏太長了,但它在這個註釋中的reddit線程中:[https://www.reddit.com/r/learnpython/comments/69dsq1/code_help /]仍然看起來像是一件有趣的事情。 –

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'])