通过命令行将字典传递给Python脚本

Chr*_*ams 5 python command-line

如何通过命令行从另一个python脚本将字典传递给python脚本?我使用subprocess来调用第二个脚本.

我得到的选项是:
I)构建一个模块来解析字符串中的字典(比我希望的更深入).
II)使用临时文件编写pickle,并将文件名作为参数传递
III)不允许使用字典,但处理键/值对(即"prog.py keya valuea keyb valub")

解决方案不一定是用户友好的,但确实需要程序友好.由于安全性和资源问题,第二个程序必须作为单独的进程运行.

Mik*_*one 8

您是否看过pickle模块以通过stdout/stdin传递数据?

例:

knights.py:

import pickle
import sys

desires = {'say': 'ni', 'obtain': 'shrubbery'}
pickle.dump(desires, sys.stdout)
Run Code Online (Sandbox Code Playgroud)

roundtable.py:

import pickle
import sys

knightsRequest = pickle.load(sys.stdin)
for req in knightsRequest:
    print "The knights %s %s." % (req, knightsRequest[req])
Run Code Online (Sandbox Code Playgroud)

用法和输出:

$ python knights.py | python roundtable.py
The knights say ni.
The knights obtain shrubbery.
Run Code Online (Sandbox Code Playgroud)


Ros*_*ght 6

如果您不需要太复杂的数据结构,我可以推荐simplejson吗?它可以作为jsonPython 2.6及更高版本中的内置模块(称为)使用.


Fog*_*ird 6

除此之外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'}
Run Code Online (Sandbox Code Playgroud)