bash和python管道之间的区别

Kri*_*itz 5 python bash pipe python-3.x python-3.2

我有以下三个python脚本:

parent1.py

import subprocess, os, sys

relpath = os.path.dirname(sys.argv[0])
path = os.path.abspath(relpath)
child = subprocess.Popen([os.path.join(path, 'child.lisp')], stdout = subprocess.PIPE)
sys.stdin = child.stdout
inp = sys.stdin.read()
print(inp.decode())
Run Code Online (Sandbox Code Playgroud)

parent2.py:

import sys
inp = sys.stdin
print(inp)
Run Code Online (Sandbox Code Playgroud)

child.py:

print("This text was created in child.py")
Run Code Online (Sandbox Code Playgroud)

如果我用parent1.py调用:

python3 parent1.py
Run Code Online (Sandbox Code Playgroud)

它给了我预期的以下输出:

This text was created with child.py
Run Code Online (Sandbox Code Playgroud)

如果我用parent2.py调用:

python3 child.py | python3 parent2.py
Run Code Online (Sandbox Code Playgroud)

我得到相同的输出.但是在第一个例子中,我得到child.py的输出作为字节,而在第二个例子中我直接得到它作为字符串.为什么是这样?它只是python和bash管道之间的区别还是我还能做些什么来避免这种情况?

Mar*_*ers 3

当 python 打开stdin和时stdout,它会检测要使用的编码并使用文本 I/O为您提供 unicode 字符串。

subprocess不会(也不能)检测您启动的子进程的编码,因此它将返回字节。您可以使用io.TextIOWrapper()实例来包装child.stdout管道以提供 unicode 数据:

sys.stdin = io.TextIOWrapper(child.stdout, encoding='utf8')
Run Code Online (Sandbox Code Playgroud)

  • 是的。我想补充一点,操作系统中只有一种管道,bash 和 Python 使用的管道是一样的。对流的解释可以不同,Python 区分了这两种情况;在一种情况下,它将输入解释为字节,在另一种情况下,它将输入解释为字符串/unicode。 (2认同)