从 Python 3.X 中的 HTTP 响应中获取并评估 Python 代码

Fetching and evaluating a Python code from an HTTP response in Python 3.X

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

如果我一直在使用 Python 2.X,我会执行以下操作:

import urllib
d = eval(urllib.request.urlopen(input_url).read())
process(d)

问题是我使用的是 Python 3.4,read 方法 returns 是 bytes 而不是 string,如 Python 2.X,所以我不能在上面使用eval功能。

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

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

这是一个示例,其中我上传了 dict 个文字作为 Github gist:

import urllib.request
import ast

url = ("https://gist.githubusercontent.com/eldridgejm/76c78b7d11a66162687b/" +
      "raw/60a76770970715f859d1e3d33c8e2afcac296a31/gistfile1.txt")

r = urllib.request.urlopen(url).read()
d = ast.literal_eval(r.decode())

print(d)

运行 以上打印:

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

使用 jme 的例子,如果它是有效的 json 我认为你可以只使用请求并使用 .json:

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}