python 3子进程错误以字节为单位

Posted

技术标签:

【中文标题】python 3子进程错误以字节为单位【英文标题】:python 3 subprocess error in bytes 【发布时间】:2013-05-20 23:24:29 【问题描述】:

很好,我的线程输出有点问题,我进入unicode或者我认为不让我将它转换为utf-8,这是代码:

import subprocess,sys,time

string = b'dir'
process = subprocess.Popen('cmd.exe', shell=True,cwd="C:\\",stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=None)
process.stdin.write(string)
o,e=process.communicate()
process.wait()
process.stdin.close()
print (o.encode('utf-8'))

我跳转如下错误:

**Traceback (most recent call last):
  File "C:\Documents and Settings\francisco\Escritorio\k.py", line 12, in <module>
    print (o.encode(utf-8))
AttributeError: 'bytes' object has no attribute 'encode'**

如果我打印离开打印并且如果你让我:

print(o)

但它会打印以下内容:

**b'Microsoft Windows XP [Versi\xa2n 5.1.2600]\r\n(C) Copyright 1985-2001 Microsoft Corp.\r\n\r\nC:\\>\xa8M\xa0s? '**

如果我改变这两行:

string = bytes('dir',encoding="utf-8") 
print (n[0].decode("latin"))

我只打印部分输出

失败了?


我是这样解决的:

process.stdin.write("dir\n".encode())
o,e=process.communicate()
print (o.decode("utf-8"))

但我得到错误:

回溯(最近一次通话最后一次): 文件“C:\Documents and Settings\francisco\Escritorio\k.py”,第 6 行,在 打印(o.decode(“utf-8”)) UnicodeDecodeError:“utf-8”编解码器无法解码位置 103 中的字节 0xa3:无效起始字节

我只是这样打印:

print (o.decode("latin"))

在拉丁语中,我可以更正这个错误并用 utf-8 打印它吗?

【问题讨论】:

【参考方案1】:

o,来自proc.communicate() 的第一个返回值,已经是bytes 而不是str,因此它已经以某种编码方式进行了编码(或者您可以将其视为一个字节序列)。

在 Python3 中,bytes 可以解码strstr 可以编码bytes,但bytes 永远不能编码, 和 str 永远无法解码。这就是 Python3 抱怨的原因,

AttributeError: 'bytes' object has no attribute 'encode'

【讨论】:

"在 Python3 中字节可以解码为 str"。好的。 如何?您的回答解释了原因,但没有给出解决方案或示例...... 解决方案是添加nothing。为了解决这个问题,就像print (o) 而不是print (o.decode("latin"))

以上是关于python 3子进程错误以字节为单位的主要内容,如果未能解决你的问题,请参考以下文章

如何读取子进程标准输出的第一个字节,然后在 Python 中丢弃其余字节?

如何使用带有字节而不是文件的python子进程

Python 子进程返回错误的退出代码

Python子进程以异步方式Popen

Python标准库06 子进程 (subprocess包)

Python子进程错误:使用标准输入将输入传递到终端