2

在 Python 代码中,我经常向 shell 发送命令并使用

import subprocess as S
x = subprocess.Popen('<command>', shell=True, stdout=S.PIPE)
x.stdout.read()

, 有<command>问题的 shell 命令在哪里。但是,我发现当在子进程中发出此指令时stty size,例如对于 command ,shell 会响应

stty: stdin isn't a terminal

我的指令返回一个空字符串。遵循http://docs.python.org/library/subprocess#popen-objects上的 Python 文档,我也尝试替换stdout.read()communicate()

x = subprocess.Popen('<command>', shell=True, stdin=S.PIP, stdout=S.PIPE)
x.stdout.read()

但是外壳仍然以相同的方式响应。

我的问题:如何让 Python 将标准输入视为终端?

4

1 回答 1

2

并不是说 Python 没有将标准输入视为终端。如果 stdin 是一个终端,Python 可能会这样对待它。但子进程的标准输入可能不是。在第二种情况下,它绝对不是终端,因为您明确地使用了管道。

您可能无法让 stty 将管道视为终端,除非更改其工作方式。但这可能不是你想要做的,无论如何。

但是,如果 Python 自己的标准输入是 tty,那么您的第一个示例应该可以工作,因为 stty 应该从 shell 继承它。

也许我不清楚您所说的“当此指令在子流程中发出时”是什么意思。从技术上讲,Un*x 系统上除了 init/launchd 之外的所有内容都是子进程。

于 2012-06-25T00:57:17.513 回答