Python 2/3 subprocess.Popen和非ascii字符

时间:2017-03-02 12:09:28

标签: python python-2.7 python-3.x

我正在尝试执行通过subprocess.Popen调用作为字符串传递的命令,我想知道如何在大多数平台和python 3/2不可知的方式中执行它。这是一个例子:

# content of test.py
import subprocess

with open('test.cmd', 'rb') as f:
    cmd = f.read().decode('UTF-8')

print(cmd)

pro = subprocess.Popen('bash',
    stderr=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stdin=subprocess.PIPE)

out, err = pro.communicate(cmd)

pro.wait()
print(out)
print(err)

我正在通过从文件中读取字符串来传递带有非ascii字符的字符串,这里是test.cmd文件的内容:

echo АБВГ

字符串读取正常,print(cmd)语句的输出正确。然而,当我尝试传递cmd来传递功能时,它失败了。在python 2中它说'ascii'编解码器不能对字符进行编码,所以它似乎试图将它从str转换为unicode,它认为str只有latin1字符。我应该如何以正确的方式编码str对象?在python 3中,通信函数需要字节作为输入,但应该使用什么编码?

1 个答案:

答案 0 :(得分:2)

  

在python 2中它说“ascii”编解码器无法对字符进行编码,所以它似乎试图将其转换为unicode

它尝试将unicode编码为str。尝试明确地对其进行编码pro.communicate(cmd.encode('utf-8'))