Python sys.stdin 和子进程stdout区别

Python sys.stdin and subprocess stdout difference

我目前手头有一个更大的问题,所以我开始尝试匹配较小的差异,看看是否能解决我的问题。

在我的程序中,我使用管道并通过 sys.stdin 迭代该输入。我注意到它的类型是 <class '_io.TextIOWrapper'>。我试图避免使用管道并将我的代码替换为使用 subprocess.run() 并注意到结果的类型为 <class 'str'>

这可能是一个非常愚蠢的问题,但我想知道为什么它们不同,以及我是否可以使子进程标准输出与 sys.stdin.

的类型相同

使用 Python 3.7.5

你是在比较苹果和橘子。 sys.stdincontentsstr 个实例(尽管你可以将其配置为 return bytes,有点费力;subprocess on Python 3.x returns bytes 除非您指定 text=True 或类似的将这些字节解码为 str).

Python 3.7.2 (default, Jan 29 2019, 13:41:02) 
[Clang 10.0.0 (clang-1000.10.44.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> type(sys.stdin)
<class '_io.TextIOWrapper'>
>>> line = sys.stdin.readline()
fnord
>>> type(line)
<class 'str'>
>>> import subprocess
>>> s = subprocess.run(['true'], capture_output=True, text=True)
>>> type(s)
<class 'subprocess.CompletedProcess'>
>>> type(s.stdout)
<class 'str'>

subprocess.run returns 一个 CompletedProcess 实例,收集的 stdout/stderr 一次捕获。

如果你想要一个流,创建一个 Popen 实例,它将具有 stdoutstderr 属性,它们的行为类似于 sys.stdin,以及一个 stdin 属性类似于 sys.stdout。但如果你做任何花哨的事情,请注意管道 buffering/deadlock 问题。