在 Python 代码中,我经常向 shell 发送命令并使用
import subprocess as S
x = subprocess.Popen('<command>', shell=True, stdout=S.PIPE)
x.stdout.read()
,其中<command>
是有问题的外壳命令。但是,我发现当在子进程中发出此指令时,例如,对于命令stty size
,shell 的响应为
stty: stdin isn't a terminal
我的指令返回一个空字符串。按照 http://docs.python.org/library/subprocess#popen-objects 的 Python 文档,我也尝试用 communicate()
替换stdout.read()
:
x = subprocess.Popen('<command>', shell=True, stdin=S.PIP, stdout=S.PIPE)
x.stdout.read()
但外壳仍然以相同的方式响应。
我的问题:如何让 Python 将标准输入视为终端?
这并不是说 Python 没有像对待终端一样对待 stdin;如果 stdin 是一个终端,Python 很可能就是这样对待它。但子过程的 stdin 可能不是。在第二种情况下,它绝对不是终端,因为您显式使用管道代替。
你可能无法让 stty 将管道视为终端,除非改变它的工作方式。但无论如何,这可能不是你想做的。
但是,如果 Python 自己的 stdin 是 tty,你的第一个示例应该可以工作,因为 stty 应该从 shell 继承它。
也许我不清楚您所说的"当此指令在子进程中发出时"是什么意思。从技术上讲,Un*x 系统上除了初始化/启动之外的所有内容都是一个子进程。