从 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}
我正在编写一个 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}