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

6 投票
6 回答
7227 浏览
提问于 2025-04-16 04:30

我想知道怎么从一个Python脚本通过命令行把一个字典传给另一个Python脚本。我用subprocess来调用第二个脚本。

我想到的几种方法是:
I) 创建一个模块,从字符串中解析出字典(这比我原本想的要复杂得多)。
II) 使用一个临时文件来写入一个pickle,然后把文件名作为参数传递。
III) 不允许使用字典,而是处理键值对(也就是说像这样“prog.py keya valuea keyb valueb”)。

这个解决方案不需要对用户友好,但必须对程序友好。第二个程序必须作为一个独立的进程运行,这是出于安全和资源的考虑。

6 个回答

6

如果你不需要特别复杂的数据结构,我推荐你试试 simplejson。在Python 2.6及以后的版本中,它作为一个内置模块(叫做 json)可以直接使用。

9

你有没有看过 pickle 这个模块,用来在标准输出和标准输入之间传递数据?

下面是一个例子:

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.
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'}

撰写回答