我有以下三个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())

parent2.py:
import sys
inp = sys.stdin
print(inp)

child.py:
print("This text was created in child.py")

如果我用以下方式调用parent1.py:
python3 parent1.py

它给了我预期的以下输出:
This text was created with child.py

如果我用以下方式调用parent2.py:
python3 child.py | python3 parent2.py

我得到相同的输出。但是在第一个示例中,我以字节为单位获取child.py的输出,在第二个示例中,我以字符串形式直接获取了它。为什么是这样?仅仅是python和bash管道之间的区别,还是我可以做些其他事情来避免这种情况?

最佳答案

当python打开stdinstdout时,它将检测要使用的编码,并使用text I/O为您提供unicode字符串。

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

sys.stdin = io.TextIOWrapper(child.stdout, encoding='utf8')

关于python - bash和python管道之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16446988/

10-12 00:21
查看更多