Python3 TypeError:必须是str,而不是带有sys.stdout.write()的字节
我正在寻找一种从python脚本运行外部进程并在执行期间打印其标准输出消息的方法。Python3 TypeError:必须是str,而不是带有sys.stdout.write()的字节,python,Python,我正在寻找一种从python脚本运行外部进程并在执行期间打印其标准输出消息的方法。 下面的代码可以工作,但在运行时不打印标准输出。当它退出时,我得到以下错误: sys.stdout.write(nextline)类型错误:必须是str,而不是bytes 我使用的是Python3.3.2,Python3对字符串的处理有些不同。最初只有一种类型的 字符串:str。当unicode在90年代获得发展时,新的unicode类型 被添加来处理Unicode,而不破坏预先存在的代码1。这是 实际上与str相
下面的代码可以工作,但在运行时不打印标准输出。当它退出时,我得到以下错误: sys.stdout.write(nextline)类型错误:必须是str,而不是bytes
我使用的是Python3.3.2,Python3对字符串的处理有些不同。最初只有一种类型的 字符串:
str
。当unicode在90年代获得发展时,新的unicode
类型
被添加来处理Unicode,而不破坏预先存在的代码1。这是
实际上与str
相同,但支持多字节
在Python 3中,有两种不同的类型:
类型。这只是一个字节序列,Python不知道 任何关于如何将其解释为字符的信息字节
类型。这也是一个字节序列,但Python知道如何 将这些字节解释为字符str
- 已删除单独的
类型unicode
现在支持unicodestr
显式地告诉Python使用哪种编码(或显式地告诉Python使用哪种编码) 猜测)通常更好,更符合“Python哲学” “的” 此更改与Python 2不兼容,因为许多返回值已更改, 导致像这样的微妙问题;这可能是主要原因 Python3的采用非常缓慢。因为Python没有静态类型2 不可能使用脚本(例如捆绑的
2to3
)
- 您可以使用
将字节('h€llo','utf-8')
转换为str
;这应该 制作bytes
。请注意如何将一个字符转换为三个字符 字节b'H\xe2\x82\xacllo'
- 您可以使用
将b'H\xe2\x82\xacllo.decode('utf-8')
转换为bytes
str
nextline
的类型为bytes
,而不是str
,
从子进程读取stdout
和stdin
在Python 3中从str
更改为
字节
。这是因为Python无法确定使用哪种编码。信息技术
可能与sys.stdin.encoding
(系统的编码)相同,
但这不能确定
您需要替换:
sys.stdout.write(nextline)
与:
或者可能:
sys.stdout.write(nextline.decode(sys.stdout.encoding))
如果nextline='',您还需要将修改为如果nextline==b'
,因为:
>>> '' == b''
False
另请参见和
1有一些巧妙的技巧,你可以用ASCII做,但你不能用多字节字符集做;最著名的例子是“用空格切换大小写的异或”(例如,chr(ord('a')^ord(''))='a'
)和“设置第6位以生成控制字符”(例如,ord('\t')+ord('@')==ord('I')
)。ASCII是在这样一个时代设计的:操纵单个位是一种对性能影响不可忽略的操作
2是的,您可以使用函数注释,但这是一个相对较新的功能,很少使用。而如果子进程中的字节使用sys.stdout.encoding进行编码(或兼容的编码,如从输出ASCII的工具读取,而您的stdout使用UTF-8),则可以使用可接受的答案,将任意字节写入标准输出的正确方法是:
sys.stdout.buffer.write(some_bytes_object)
这将只按原样输出字节,而不尝试在某些编码中将其视为文本。+1提示!顺便说一句,我知道我只是在程序结束时才得到标准输出。你能告诉我为什么它不能实时打印吗?在不知道什么demo.exe
输出,以及你到底想要什么的情况下,很难回答你的问题,因为不清楚问题是什么:-)注意,readline()
读一行,也就是说,它一直在读,直到遇到一个新行,我相信在Windows上是\r\n
,而不是\n
,我试图做的是在python中运行时打印demo.exe stdout消息。目前python只在子进程中打印demo.exe stdouttermination@MichaelIV不知道你为什么没有任何输出。我测试了它,它对我有效。我也在Windows上测试了它。请确保demo.exe
输出\r\n
行结尾,并且demo.exe
也在刷新标准输出。作为迁移的一部分,可能会重复,我将接受正确的答案。例如,我无法更改csv模块写入数据的方式。因此,在我看来,最好的方法就是将数据按原样传递给stdout。谢谢你的作品!谢谢这就是我要找的:D
>>> '' == b''
False
sys.stdout.buffer.write(some_bytes_object)