如何通过 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)
输出:
File "getPickle" line 10, in <module>
results = pickle.load(stdout)
AttributeError: 'str' object has no attribute 'readline'
我该怎么做才能从 stdout 取回 pickle?
谢谢
使用pickle.loads
从字符串加载pickle。 pickle.load
用于从流中加载。
两条不相关的评论:
如果您正在使用 Python 2,您可能想要 import cPickle as pickle
因为 C 版本快很多倍而且同样强大。
除非你特别想支持旧的 Python 版本,最好在转储端使用 protocol=-1
以指定最新的 Pickle 协议,这是比默认的 lowest/oldest 版本更有效。
@user4815162342 给出了正确答案。为了crystal清楚,下面的示例代码展示了如何检索腌制对象。
请注意,将 dump
和 loads
配对有点不寻常,但这是需要做的,因为 p.communicate
returns 来自 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}
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 取回 pickle?
谢谢
使用pickle.loads
从字符串加载pickle。 pickle.load
用于从流中加载。
两条不相关的评论:
如果您正在使用 Python 2,您可能想要
import cPickle as pickle
因为 C 版本快很多倍而且同样强大。除非你特别想支持旧的 Python 版本,最好在转储端使用
protocol=-1
以指定最新的 Pickle 协议,这是比默认的 lowest/oldest 版本更有效。
@user4815162342 给出了正确答案。为了crystal清楚,下面的示例代码展示了如何检索腌制对象。
请注意,将 dump
和 loads
配对有点不寻常,但这是需要做的,因为 p.communicate
returns 来自 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}