2013-11-24 5 views
0

Я действительно новичок в python, это первый раз, когда я пишу это на самом деле. И я создаю программу, которая получает число просмотров на поток 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"] 

I Вызов функции отсюда:

urls = [] 

urls.append(getURL()) 

Что я делаю неправильно? Я пытался понять это на протяжении веков ... И если кто-нибудь знает, как это исправить, я был бы самым счастливым человеком в живых;)

Заранее спасибо.

EDIT:

Это весь код, у меня есть.

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 (выход) [ "потоки"] [ "худший"] [ "URL"]

+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, потому что вы не прикрепляли к нему трубу. Затем вы пытаетесь разобрать None, используя json.loads(), который ожидал str или объект buffer.

Если вы хотите получить вывод 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

Смежные вопросы