如何通过命令行从另一个python脚本将字典传递给python脚本?我使用subprocess来调用第二个脚本。
我遇到的选择是:
I)构建一个模块来解析字符串中的字典(比我希望的更深入)
II)使用临时文件编写pickle,并将文件名作为参数传递
III)不允许使用字典,但处理键/值对(即“prog.py keya valuea keyb valub”)
解决方案不一定是用户友好的,但确实需要程序友好。由于安全性和资源问题,第二个程序必须作为单独的进程运行。
答案 0 :(得分:8)
您是否看过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.
答案 1 :(得分:6)
如果您不需要太复杂的数据结构,我可以推荐simplejson吗?它在Python 2.6及更高版本中作为内置模块(称为json
)提供。
答案 2 :(得分:6)
除了pickle
之外,如果你的词典只包含Python原语,则另一个选项是ast.literal_eval
。
>>> 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'}
答案 3 :(得分:2)
如果字典中的内容(键和值都可以)表示为字符串,您应该能够将它作为字符串参数传递给可以重新创建它的第二个脚本。
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
答案 4 :(得分:0)
xmlrpc怎么样?
客户端 http://docs.python.org/library/xmlrpclib.html
服务器 http://docs.python.org/library/simplexmlrpcserver.html
两者都在python核心。
答案 5 :(得分:0)
只需在一个python脚本中打印字典
print( "dict=" + str(dict) )
并将其用作
(python script1.py; cat script2.py) | python -
现在您应该能够通过第二个python脚本中的全局变量'dict'访问字典。