2

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

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

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

4

3 回答 3

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 文字结构组成:字符串、数字、元组、列表、字典、布尔值和无。

于 2013-06-22T11:20:13.147 回答
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'}]
于 2013-06-22T11:20:03.960 回答
1

首先,为什么不导入另一个脚本,并从中调用一个函数来返回数据呢?这将返回一个完整的 python 对象,而不必处理字符串。

如果您确实想传递结构,我会使用该json模块来序列化和反序列化字典列表:

print json.dumps(yourlist)

yourlist = json.loads(stdoutdata)

这将使您的其他脚本的输出对 Python 之外的更多工具有用。

于 2013-06-22T11:20:46.263 回答