如何通過命令行將字典傳遞到另一個python腳本的python腳本?我使用子進程來調用第二個腳本。通過命令行將字典傳遞給Python腳本
我來的選項是:
I)構建一個模塊來解析字符串中的字典(比我希望去的更深入)。
II)使用一個臨時文件寫泡菜,並通過文件名作爲參數
III)不允許詞典,但處理鍵/值對(即「prog.py科亞值a KEYB valub」)
該解決方案不一定要用戶友好,但需要編程友好。由於安全和資源問題,第二個程序必須作爲單獨的進程運行。
如何通過命令行將字典傳遞到另一個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'}
如果你不需要太複雜的數據結構,我可以推薦simplejson?它在Python 2.6及更高版本中作爲內置模塊(稱爲json
)提供。
xmlrpc怎麼樣?
客戶 http://docs.python.org/library/xmlrpclib.html
服務器 http://docs.python.org/library/simplexmlrpcserver.html
兩者都是蟒蛇核心。
看起來像是爲了傳遞'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.
不是一個壞主意! – 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
這就是我正在尋找的 – 2010-09-23 18:06:04