gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:41 25 4
gpt4 key购买 nike

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

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 时,该编码仅用于对您发送到子进程或从子进程接收的文本进行编码。它不会影响子流程本身,只会影响您的流程与子流程的通信方式。

关于python - 子进程如何决定将什么编码写入仅接受 str 的文件对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55657962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com