子进程如何决定写入仅接受str的文件对象的编码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子进程如何决定写入仅接受str的文件对象的编码相关的知识,希望对你有一定的参考价值。

我发现以下行为令人困惑:

Python 3.7.2 (default, Feb 12 2019, 08:15:36) 
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> import sys
>>> sys.stdout.write(b'')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: write() argument must be str, not bytes
>>> subprocess.run('echo', stdout=sys.stdout)

CompletedProcess(args='echo', returncode=0)

sys.stdout不接受二进制文件。我没有在我的subprocess调用上指定编码,这意味着它应该是流二进制文件。在这种情况下,子进程如何知道不提供文件对象二进制数据?

答案

你误解了子过程是如何工作的。子进程不与sys.stdout对象交互 - 该对象仅存在于python中,并且仅存在于您的进程中。

要了解实际发生的情况,首先需要了解操作系统如何处理IO。在操作系统级别,为每个打开的文件(或管道)分配一个ID - 这称为file handle。例如,stdout的句柄通常是数字1

>>> sys.stdout.fileno()
1

启动子进程时,只将此文件句柄传递给子进程。子进程无权访问sys.stdout文件对象。所有子进程可以做的是将字节写入它收到的文件句柄。 (在操作系统级别,只有字节,没有文本。)您不能强制子进程使用特定的编码。

encoding参数传递给subprocess.run时,该编码仅用于编码发送到子进程或从子进程接收的文本。它不会影响子进程本身,它只会影响进程与子进程的通信方式。

以上是关于子进程如何决定写入仅接受str的文件对象的编码的主要内容,如果未能解决你的问题,请参考以下文章

在将输出写入文件时使用多处理显示来自子进程的实时输出

子进程写入文件时经常检查文件

C多个进程写入1个管道

如何让父进程和子进程相互监听?

可以python子进程Popen接受多个stdin流吗?

如何将视频文件作为输入传递给 NodeJS 中的子进程并接收帧/图像作为输出?