2010-09-23 103 views
5

如何通過命令行將字典傳遞到另一個python腳本的python腳本?我使用子進程來調用第二個腳本。通過命令行將字典傳遞給Python腳本

我來的選項是:
I)構建一個模塊來解析字符串中的字典(比我希望去的更深入)。
II)使用一個臨時文件寫泡菜,並通過文件名作爲參數
III)不允許詞典,但處理鍵/值對(即「prog.py科亞值a KEYB valub」)

該解決方案不一定要用戶友好,但需要編程友好。由於安全和資源問題,第二個程序必須作爲單獨的進程運行。

回答

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

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

6

如果你不需要太複雜的數據結構,我可以推薦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

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

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

0

只是打印一個python腳本

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

字典,並使用它作爲

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

,現在你應該能夠獲得通過在全局變量「字典」字典第二個python腳本。

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

相關問題