如何通过子流程.Popen

2024-10-01 04:46:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

^{pr2}$

输出:

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

我该怎么做才能从stdout拿回pickle?在

谢谢你


Tags: pyimportcmdstderrstdoutloadresultspickle
2条回答

@user4815162342给出了正确答案。为了清楚地说明这一点,下面的示例代码演示了如何检索pickled对象。在

注意,将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}

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

两个无关的评论:

  • 如果您使用的是python2,您可能希望import cPickle as pickle,因为C版本的速度要快很多倍,而且功能也一样强大。

  • 除非您特别希望支持旧的Python版本,否则最好在dump端使用protocol=-1,以便指定最新的Pickle协议,这比默认的最低/最旧版本更有效。

相关问题 更多 >