5

我有以下三个 python 脚本:

父1.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())

父母2.py:

import sys
inp = sys.stdin
print(inp)

孩子.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 管道之间的区别还是我可以做些什么来避免这种情况?

4

1 回答 1

3

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

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

sys.stdin = io.TextIOWrapper(child.stdout, encoding='utf8')
于 2013-05-08T17:48:09.477 回答