2013-11-24 75 views
0

我真的很陌生,這是我第一次真正寫它。 而我創建一個程序,得到的一個Twitch.tv流視圖的數量,但我得到一個錯誤預期的字符串或緩衝區的Python當我調用這個函數預期的字符串或緩衝區Python

def getURL(): 
    output = subprocess.Popen(["livestreamer", "twitch.tv/streamname", "-j"], stdout=subprocess.PIPE).communicate()[1] 
    return json.loads(output)["streams"]["worst"]["url"] 

我從這裏調用功能:

urls = [] 

urls.append(getURL()) 

我在做什麼錯?我一直在想這個問題已經存在很多年了......如果有人知道如何解決這個問題,我會成爲最幸福的人;

在此先感謝。

編輯:

這是我所有的代碼。

import requests 
import subprocess 
import json 
import sys 
import threading 
import time 

urls = [] 
urlsUsed = [] 

def getURL(): 
output = subprocess.Popen(["livestreamer", "twitch.tv/hemzk", "-j"],  stdout=subprocess.PIPE).communicate()[1] 
return json.loads(output)["streams"]["worst"]["url"] 

def build(): 

global numberOfViewers 

    urls.append(getURL()) 

而我得到的錯誤在回報json.loads(輸出) 「流」] [ 「最差」] [ 「網址」]

+0

發佈完整的代碼示例和錯誤消息,我會看看。 –

+0

至少說錯誤指的是哪一行。 –

回答

0

變化

output = subprocess.Popen(["livestreamer", "twitch.tv/streamname", "-j"], 
          stdout=subprocess.PIPE).communicate()[1] 

output = subprocess.Popen(["livestreamer", "twitch.tv/streamname", "-j"], 
          stdout=subprocess.PIPE).communicate()[0] 

(更改1至0)。

您的問題的更詳細的解釋如下。 Popen.communicate返回一個元組stdout, stderr。在這裏,看起來你對stdout(索引0)感興趣,但是你正在挑選stderr(索引1)。 stderr這裏是None,因爲你沒有附加管道。然後嘗試使用json.loads()解析None,該預期爲strbuffer對象。

如果要輸入stderr輸出,則必須將stderr=subprocess.PIPE添加到您的Popen構造函數調用中。

+0

謝謝!這工作。但是我仍然在同一行發生錯誤,但是這一次,它是**不能在類似字節的對象上使用字符串模式** – Tokfrans

+0

您使用的是Python 3+嗎?如果是這樣,你必須顯式地將'bytes'對象(你的'stdout')轉換成一個字符串。例如:'json.loads(stdout.decode(encoding ='UTF-8'))'。 – Max

+0

有關更多詳細信息,請參見http://stackoverflow.com/questions/14010551/how-to-convert-between-bytes-and-strings-in-python-3 – Max

相關問題