簡體   English   中英

如何通過subprocess.Popen接收pickle

[英]How to receive pickle via subprocess.Popen

getPickle.py

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'

我該怎么做才能從stdout回來泡菜?

謝謝

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

兩個不相關的評論:

  • 如果您使用的是Python 2,您可能希望import cPickle as pickle因為C版本的速度要快很多,同樣強大。

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

@ 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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM