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

2024-06-16 22:06:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

^{pr2}$

我的指令返回一个空字符串。在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将标准输入作为终端处理?在


Tags: 代码import命令trueread进程asstdout
1条回答
网友
1楼 · 发布于 2024-06-16 22:06:08

这并不是说Python没有将stdin当作一个终端来对待;如果stdin是一个终端,Python很可能会将其视为终端。但子进程的stdin可能不是。在第二种情况下,它肯定不是终端,因为您显式地使用管道。在

如果不改变管道的工作方式,你可能无法让stty把管道当作终端。但无论如何,这可能不是你想做的。在

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

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

相关问题 更多 >