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

问题描述 投票:4回答:1

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

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调用上指定编码,这意味着它应该是流二进制文件。在这种情况下,子进程如何知道不提供文件对象二进制数据?

python subprocess
1个回答
3
投票

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

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

>>> sys.stdout.fileno()
1

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

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

© www.soinside.com 2019 - 2024. All rights reserved.