2013-06-22 5 views
2

У меня есть программа, где мне нужно вызвать другой скрипт py из одного скрипта py и получить из него список dicts. Я выяснил, как вызвать другой скрипт py и получить список как строку из stdout, но как использовать его во втором скрипте? Вот что выдает второй скрипт.Получите список dicts из другого скрипта python?

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

Мне нужен этот список в первом скрипте. Одно из решений, которое я нашел, - это использование exec, но это вызывает некоторые проблемы с безопасностью, и я хотел бы избежать этого.

+0

Как только вы используете stdio для связи, я предполагаю, что ваш список dicts не должен включать экземпляры пользовательского класса. Вы считаете использовать 'json' для связи? – oleg

ответ

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, booleans, и None.

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'}] 
1

Прежде всего, почему бы не импорта другой сценарий, и вызовите функцию от него вернуть вам данные? Это вернет вам полный объект python вместо того, чтобы обрабатывать строки.

Если вы хотите передать структуры вокруг, я бы использовал json модуль для сериализации и десериализации список словарей:

print json.dumps(yourlist) 

и

yourlist = json.loads(stdoutdata) 

Это было бы сделать вывод вашего другого скрипта полезны для большего количества инструментов за пределами Python.

+0

изменить: nvm просто прочитал последнее предложение – jamylak

Смежные вопросы