我有一个程序,我需要从一个py脚本调用另一个py脚本并从中获取一个dicts列表。我已经想出如何调用另一个py脚本并从stdout获取列表作为字符串但是如何在第二个脚本中使用它? 这是第二个脚本输出的内容。
[{'itemkey1': 'item1', 'itemkey2': 'item2'}, {'itemkey1': 'item1', 'itemkey2': 'item2'}]
我需要在第一个脚本中使用此列表。我找到的一个解决方案是使用exec
,但这会带来一些安全问题,因为我想避免它。
答案 0 :(得分:3)
使用subprocess.check_output
从字符串中获取该脚本的输出,然后将ast.literal_eval
应用于该字符串以获取dict对象。
import ast
import subprocess
ret = subprocess.check_output(['python','some_script.py'])
dic = ast.literal_eval(ret)
ast.literal_eval
演示:
>>> ret = "[{'itemkey1': 'item1', 'itemkey2': 'item2'}, {'itemkey1': 'item1', 'itemkey2': 'item2'}]\n"
>>> ast.literal_eval(ret)
[{'itemkey2': 'item2', 'itemkey1': 'item1'}, {'itemkey2': 'item2', 'itemkey1': 'item1'}]
帮助 ast.literal_eval :literal_eval(node_or_string)
安全地评估表达式节点或包含Python的字符串 表达。提供的字符串或节点可能仅包含以下内容 Python文字结构:字符串,数字,元组,列表,dicts,布尔值, 没有。
答案 1 :(得分:1)
ast.literal_eval
完全安全
>>> import ast
>>> output = "[{'itemkey1': 'item1', 'itemkey2': 'item2'}, {'itemkey1': 'item1', 'itemkey2': 'item2'}]"
>>> ast.literal_eval(output)
[{'itemkey2': 'item2', 'itemkey1': 'item1'}, {'itemkey2': 'item2', 'itemkey1': 'item1'}]
答案 2 :(得分:1)
首先,为什么不导入另一个脚本,并从中调用一个函数来返回数据?这将返回一个完整的python对象,而不是必须处理字符串。
如果你想传递结构,我会使用json
模块序列化和反序列化字典列表:
print json.dumps(yourlist)
和
yourlist = json.loads(stdoutdata)
这会使你的其他脚本的输出对Python之外的更多工具有用。