如何通过subprocess.Popen接收pickle

时间:2015-12-09 14:16:57

标签: python subprocess stdout pickle

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)

输出:

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

如何从stdout获取泡菜?

谢谢

2 个答案:

答案 0 :(得分:3)

使用pickle.loads从字符串加载pickle。 pickle.load用于从流中加载。

两个不相关的评论:

  • 如果你使用的是Python 2,你可能想要import cPickle as pickle,因为C版本的速度要快很多,同样强大。

  • 除非您特别想要支持较旧的Python版本,否则最好在转储端使用protocol=-1以指定最新的Pickle协议,该协议比默认的最低/最旧版本更有效版本

答案 1 :(得分:0)

@ user4815162342给出正确答案。为了清楚起见,这里的示例代码显示了如何检索pickle对象。

请注意,配对dumploads有点不寻常,但需要做的是p.communicate返回字符串来自标准输出。

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