2015-12-09 25 views
2

getPickle.py如何通過subprocess.Popen收到泡菜

import pickle 
import subprocess 

cmd = ['rsh', 'host1', 'sendPickle.py'] 
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
stdout, stderr = p.communicate() 
results = pickle.load(stdout) 
print results 

sendPickle.py

import pickle 
import sys 

to_return = {'a':1, 'b': 2} 
pickle.dump(to_return, sys.stdout) 

OUTPUT:

File "getPickle" line 10, in <module> 
    results = pickle.load(stdout) 
AttributeError: 'str' object has no attribute 'readline' 

我能做些什麼讓泡菜從標準輸出回?

謝謝

回答

3

使用pickle.loads從字符串加載鹹菜。 pickle.load用於從流中加載。

兩個不相關的話:

  • 如果你正在使用Python 2中,你可能想import cPickle as pickle因爲C版本是許多時間更快,一樣強大。

  • 除非您特別想要支持較老的Python版本,否則在轉儲端使用protocol=-1是一個好主意,以便指定最新的Pickle協議,該協議比默認最低/最舊版本更有效。

+0

@MikeMcKerns如果你有一個想法如何改進一個答案,請在編輯答案之前建議它在自己做出改變。 – user4815162342

+0

我的代碼示例是澄清了你的一句不太明確的單行註釋,這使得你說的很清楚。道歉,如果你不知何故冒犯了。所以...我建議你添加一段代碼,就像我添加的代碼一樣,所以很明顯......因爲你的答案是鈍的,這是配對'dump'和'loads'的一個不尋常的例子。 –

+0

@MikeMcKerns沒有冒犯。我不認爲我的回答是愚蠢的,但相反 - 清楚並重要。如果您認爲您可以提供更好的解釋,請隨時發佈單獨的答案。 – user4815162342

0

@ user4815162342給出正確的答案。爲了清楚起見,下面是示例代碼,顯示如何檢索pickle對象。

請注意,對dumploads進行配對有點不尋常,但這是p.communicate從stdout返回的字符串需要完成的操作。

>>> import pickle 
>>> import subprocess as sp 
>>> cmd = ['python', 'sendPickle.py'] 
>>> p = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE) 
>>> stdout, stderr = p.communicate() 
>>> stdout 
"(dp0\nS'a'\np1\nI1\nsS'b'\np2\nI2\ns." 
>>> results = pickle.loads(stdout) 
>>> results 
{'a': 1, 'b': 2}