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

问题描述:

如何通过命令行将字典传递到另一个python脚本的python脚本?我使用子进程来调用第二个脚本。通过命令行将字典传递给Python脚本

我来的选项是:
I)构建一个模块来解析字符串中的字典(比我希望去的更深入)。
II)使用一个临时文件写泡菜,并通过文件名作为参数
III)不允许词典,但处理键/值对(即“prog.py科亚值a 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'} 
+0

这就是我正在寻找的 – 2010-09-23 18:06:04

如果你不需要太复杂的数据结构,我可以推荐simplejson?它在Python 2.6及更高版本中作为内置模块(称为json)提供。

+0

是的,你可以通过JSON序列字典通过写入第二个的标准输入脚本。 – Epeli 2010-09-23 16:34:42

+0

+1,因为JSON简单,有效,并且与Python的'dict'结构几乎相同。 – jathanism 2010-09-23 17:12:33

+0

+1,因为这是完美的,虽然FoggleBird的答案是完美的,我不能说老板进入任何处理javascript的东西 – 2010-09-23 18:08:33

xmlrpc怎么样?

客户 http://docs.python.org/library/xmlrpclib.html

服务器 http://docs.python.org/library/simplexmlrpcserver.html

两者都是蟒蛇核心。

+1

看起来像是为了传递'dict'而过度使用。 – 2010-09-23 17:19:38

你看过pickle模块通过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. 
+0

不是一个坏主意! – jathanism 2010-09-23 17:13:15

只是打印一个python脚本

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

字典,并使用它作为

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

,现在你应该能够获得通过在全局变量“字典”字典第二个python脚本。

如果字典中的内容(包括键和值)都可以表示为字符串,则应该能够将其作为字符串参数传递给第二个可以重新创建它的脚本。

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 
+0

'ast.literal_eval'是做这件事的安全和正确的方法。 – FogleBird 2010-09-23 18:03:24

+0

'ast.literal_eval()'可能太严格了。可以将'eval()'第二个参数传递给另一个参数,而不是一个字典映射自定义类名到相应的自定义类,这些自定义类在提供时允许它们的实例也可以在字符串,数字,元组,列表,字典,布尔值和'ast.literal_eval()'支持的None值类型。 – martineau 2010-09-24 22:50:13