子进程如何决定写入仅接受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的文件对象的编码的主要内容,如果未能解决你的问题,请参考以下文章