即使stdin不是终端,也可以从Python子进程向stdin发送命令?

时间:2012-06-24 21:43:51

标签: python stdin subprocess

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

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

,其中<command>是有问题的shell命令。但是,我发现当在子进程中发出此指令时,对于命令stty size,例如,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()

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

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

1 个答案:

答案 0 :(得分:2)

并不是说Python不像对待终端那样对待stdin;如果stdin是终端,Python很可能会这样对待它。但子进程的stdin可能不是。在第二种情况下,它绝对不是终端,因为您明确地使用管道。

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

但是,如果Python自己的stdin是tty,那么你的第一个例子应该可以工作,因为stty应该从shell继承它。

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