从Python3.X中的HTTP响应获取和计算Python代码

从Python3.X中的HTTP响应获取和计算Python代码,python,python-3.x,eval,Python,Python 3.x,Eval,我正在编写一个Python脚本,它获取一个HTTP请求作为输入,即一个url和一些GET参数。对HTTP请求的响应是一段Python代码,表示一个大型Python字典。我的脚本应该评估检索到的代码并处理评估过的字典 如果我使用的是Python 2.X,我会完成以下工作: import urllib d = eval(urllib.request.urlopen(input_url).read()) process(d) 问题是,我使用的是Python3.4,read方法返回的是字节,而不是Py

我正在编写一个Python脚本,它获取一个HTTP请求作为输入,即一个url和一些GET参数。对HTTP请求的响应是一段Python代码,表示一个大型Python字典。我的脚本应该评估检索到的代码并处理评估过的字典

如果我使用的是Python 2.X,我会完成以下工作:

import urllib
d = eval(urllib.request.urlopen(input_url).read())
process(d)
问题是,我使用的是Python3.4,read方法返回的是字节,而不是Python2.X中的字符串,因此我不能对其使用eval函数


如何评估Python 3.X上检索到的字典?

正如@rawing在评论中所说的,您需要将字节解码为字符串。您可能还希望使用over eval,因为后者执行任意代码,并且不安全

下面是一个例子,我上传了一个文本的dict作为:

运行上述打印:

{'bar': 42, 'baz': 'apple', 'foo': 41}

使用jme的示例,如果它是有效的json(我认为很可能是),那么您可以使用请求并使用.json:


eval的可能副本可能很危险。您可能更喜欢json格式。json格式适用于您的情况吗?若否,;为什么?不要对json文本使用ast.literal\u eval。你可以。或者,如果输入是Python代码,那么您可以使用tokenizer.detect\u编码模块来识别Python源代码中的编码声明@J.F.塞巴斯蒂安很有趣,谢谢。这个答案假设文本是python文本的dict。我所知道的关于文本的唯一区别是{foo:1,2,3}不是有效的json。你知道其他的吗?Python文本和json文本是不同的格式。如果json足够,就不应该将Python dict作为文本传递。@J.F.Sebastian哦,我完全同意。OP说他拥有的是Python,而不是json。也许他的数据是有效的json,在这种情况下,他可以使用json解析器,但如果他问我可以用Python表示什么,而不是用json?的话,如果我们只限于文本,元组是我唯一知道的东西。
{'bar': 42, 'baz': 'apple', 'foo': 41}
import requests

r  = requests.get("https://gist.githubusercontent.com/eldridgejm/76c78b7d11a66162687b/raw/60a76770970715f859d1e3d33c8e2afcac296a31/gistfile1.txt")
print(r.json())
{u'baz': u'apple', u'foo': 41, u'bar': 42}