【问题标题】:Expected string or buffer Python预期的字符串或缓冲区 Python
【发布时间】:2013-11-24 12:17:33
【问题描述】:

我对python真的很陌生,这是我第一次真正写它。 我正在创建一个程序来获取 Twitch.tv 流上的观看次数,但是当我调用这个函数时,我得到一个错误 Expected string or buffer 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())

我在 return json.loads(output)["streams"]["worst"]["url"]

处遇到错误

【问题讨论】:

  • 贴出完整的代码示例和错误信息,我去看看。
  • 至少说明错误指的是哪一行。

标签: python string exception buffer


【解决方案1】:

改变

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 构造函数调用中。

【讨论】:

  • 谢谢!那行得通。但我仍然在同一行出现错误,但这一次,它是 Can't use a string pattern on a bytes-like object
  • 您使用的是 Python 3+ 吗?如果是这样,您必须将bytes 对象(您的stdout)显式转换为字符串。例如:json.loads(stdout.decode(encoding='UTF-8')).
猜你喜欢
  • 2016-01-24
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
相关资源
最近更新 更多