Передача словарей в скрипт Python через командную строку

Как передать словарь в скрипт python из другого скрипта python по командной строке? Я использую подпроцесс для вызова второго скрипта.

Варианты, к которым я пришел:
I) Создайте модуль для анализа словаря из строки (более подробно, чем я надеялся).
II) Используйте временный файл для написания рассола и передайте имя файла в качестве аргумента
III) Не разрешайте словари, но обрабатывайте пары ключ / значение (то есть «prog.py keya valuea keyb valub»)

Решение не должно быть удобным для пользователя, но оно должно быть дружественным к программам. Вторая программа должна запускаться как отдельный процесс из-за проблем с безопасностью и ресурсами.

Помимо pickle , другой вариант – ast.literal_eval , если ваши словари содержат только примитивы Python.

 >>> d = {3: 9, 'apple': 'orange'} >>> s = str(d) >>> s "{3: 9, 'apple': 'orange'}" >>> import ast >>> x = ast.literal_eval(s) >>> x {3: 9, 'apple': 'orange'} 

Вы просмотрели модуль рассола для передачи данных по stdout / stdin?

Пример:

knights.py:

 import pickle import sys desires = {'say': 'ni', 'obtain': 'shrubbery'} pickle.dump(desires, sys.stdout) 

roundtable.py:

 import pickle import sys knightsRequest = pickle.load(sys.stdin) for req in knightsRequest: print "The knights %s %s." % (req, knightsRequest[req]) 

Использование и выход:

 $ python knights.py | python roundtable.py The knights say ni. The knights obtain shrubbery. 

Если вам не нужна слишком сложная структура данных, могу ли я рекомендовать simplejson ? Он доступен как встроенный модуль (называемый json ) в Python 2.6 и более поздних версиях.

Если то, что находится в словаре (оба ключа и значения), может быть представлено как строки, вы должны передать его как строковый аргумент второму скрипту, который может его воссоздать.

 d = {'a':1,'b':2} d == eval(repr(d), None) >>>True 

Изменить: Вот несколько более привлекательный пример, показывающий его использование с простым пользовательским классом:

 class MyClass: def __init__(self, a, b): self.a = a self.b = b def __repr__(self): return 'MyClass(%r, %r)' % (self.a, self.b) def __eq__(self, other): return (self.a == other.a) and (self.b == other.b) d = {'foo':42, 'bar': MyClass(17,'astring') } print 'd:', d print 'repr(d):', repr(d) print "d == eval(repr(d), {'MyClass':MyClass})?:", \ d == eval(repr(d), {'MyClass':MyClass}) # outputs: # d: {'foo': 42, 'bar': MyClass(17, 'astring')} # repr(d): {'foo': 42, 'bar': MyClass(17, 'astring')} # d == eval(repr(d), {'MyClass':MyClass})?: True 

Как насчет xmlrpc?

Клиент http://docs.python.org/library/xmlrpclib.html

Сервер http://docs.python.org/library/simplexmlrpcserver.html

Оба они находятся в ядре python.

Просто распечатайте словарь в одном скрипте python

 print( "dict=" + str(dict) ) 

и использовать его как

 (python script1.py; cat script2.py) | python - 

и теперь вы должны иметь доступ к словарю через глобальную переменную 'dict' во втором скрипте python.