使用python pickle通过ssh传输数据

时间:2012-07-01 18:04:11

标签: ssh python-3.x pipe pickle

我想使用pythons pickle和pipe在ssh中通过管道发送一个unicode字符串:

import subprocess
import pickle

cmd=['ssh', 'user@host', '/usr/bin/env', 'python3', '-c', \
  '"import sys;import pickle;import os;os.mkdir(pickle.Unpickler(sys.stdin).load())"']

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE)

pickler = pickle.Pickler(p.stdin)

pickler.dump('äöü')

这会产生以下错误:

>>> Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python3.2/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128)

我还注意到发送到子进程的unicode字符没有正确显示,而是我只看到它们的十六进制表示。有谁知道问题是什么以及如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

Pickle需要二进制文件,并读取和写入字节数据,而subprocess为您的进程创建的stdin / stdout处于二进制模式时,sys.stdin处于文本模式。

通过更改目标代码以使用sys.stdin.buffer,上述代码可以正常工作。