从另一个python脚本获取dicts列表?

时间:2013-06-22 11:18:29

标签: python stdout communicate

我有一个程序,我需要从一个py脚本调用另一个py脚本并从中获取一个dicts列表。我已经想出如何调用另一个py脚本并从stdout获取列表作为字符串但是如何在第二个脚本中使用它? 这是第二个脚本输出的内容。

 [{'itemkey1': 'item1', 'itemkey2': 'item2'}, {'itemkey1': 'item1', 'itemkey2': 'item2'}]

我需要在第一个脚本中使用此列表。我找到的一个解决方案是使用exec,但这会带来一些安全问题,因为我想避免它。

3 个答案:

答案 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之外的更多工具有用。