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.stdin
的 contents 是 str
个实例(尽管你可以将其配置为 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
实例,它将具有 stdout
和 stderr
属性,它们的行为类似于 sys.stdin
,以及一个 stdin
属性类似于 sys.stdout
。但如果你做任何花哨的事情,请注意管道 buffering/deadlock 问题。
我目前手头有一个更大的问题,所以我开始尝试匹配较小的差异,看看是否能解决我的问题。
在我的程序中,我使用管道并通过 sys.stdin 迭代该输入。我注意到它的类型是 <class '_io.TextIOWrapper'>
。我试图避免使用管道并将我的代码替换为使用 subprocess.run()
并注意到结果的类型为 <class 'str'>
。
这可能是一个非常愚蠢的问题,但我想知道为什么它们不同,以及我是否可以使子进程标准输出与 sys.stdin.
的类型相同使用 Python 3.7.5
你是在比较苹果和橘子。 sys.stdin
的 contents 是 str
个实例(尽管你可以将其配置为 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
实例,它将具有 stdout
和 stderr
属性,它们的行为类似于 sys.stdin
,以及一个 stdin
属性类似于 sys.stdout
。但如果你做任何花哨的事情,请注意管道 buffering/deadlock 问题。