Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3 TypeError:必须是str,而不是带有sys.stdout.write()的字节_Python - Fatal编程技术网

Python3 TypeError:必须是str,而不是带有sys.stdout.write()的字节

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相

我正在寻找一种从python脚本运行外部进程并在执行期间打印其标准输出消息的方法。
下面的代码可以工作,但在运行时不打印标准输出。当它退出时,我得到以下错误:

sys.stdout.write(nextline)类型错误:必须是str,而不是bytes


我使用的是Python3.3.2,Python3对字符串的处理有些不同。最初只有一种类型的 字符串:
str
。当unicode在90年代获得发展时,新的
unicode
类型 被添加来处理Unicode,而不破坏预先存在的代码1。这是 实际上与
str
相同,但支持多字节

在Python 3中,有两种不同的类型:

  • 字节
    类型。这只是一个字节序列,Python不知道 任何关于如何将其解释为字符的信息
  • str
    类型。这也是一个字节序列,但Python知道如何 将这些字节解释为字符
  • 已删除单独的
    unicode
    类型
    str
    现在支持unicode
在Python2中,隐式假设编码可能会导致很多问题;你 可能最终使用错误的编码,或者数据可能根本没有编码 全部(例如,它是PNG图像)。
显式地告诉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
当然,UTF-8在您的情况下可能不是正确的字符集,因此请确保 使用正确的一个

在您的特定代码段中,
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)