2017-03-02 67 views
1

我试图执行通过subprocess.Popen调用作为字符串传递的命令,我想知道如何在最平台和python 3/2不可知论办法。这里有一个例子:Python 2/3 subprocess.Popen和非ASCII字符

# 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中,通信函数需要字节作为输入,但是应该使用什么编码?

+0

如果您没有将cmd解码为utf-8,那么会发生什么? – languitar

+0

如果我在读取cmd后不解码,它确实可以工作,但只在使用UTF-8作为默认控制台编码的操作系统上运行。但我正在阅读命令并对其进行解码以准确地显示情况。实际上,我在python 2和3上获得了作为str对象的命令。我想找到一种方法来做到这一点。 – user2102508

回答

2

在Python 2它说,“ASCII”编解码器不能编码的字符,如此看来它试图将其转换为Unicode

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

+0

它似乎工作,但我怎样才能确保当前的操作系统使用UTF-8编码?例如,我如何获得系统的bash编码? – user2102508

+0

你的文件可能编码了任何编码,它不依赖于操作系统。 如果你想知道哪个编码使用某个文件,你可以使用python包http://chardet.readthedocs.io/en/latest/ –

+1

不是文件,bash过程。 – user2102508