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

标签 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

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

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

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

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

最佳答案

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

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

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

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

关于python - 即使 stdin 不是终端,也从 Python 子进程向 stdin 发送命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11181439/

相关文章:

Python:subprocess32 process.stdout.readline()等待时间

python - 在 Python 3 中处理大数以计算组合

bash - 在 bash 脚本中倒带标准输入

python - 只要子进程仍在运行,subprocess.Popen 后关闭套接字就会在 TIME_WAIT 中留下套接字

bash - bash 是否可以通过 stdin/stdout 交替读取和写入子进程 "interactively"?

c++ - 从键盘读取输入

python - 如何从 Flask Rest API 在后台运行长时间运行的 python 脚本?

Python - 将数据拆分为 csv 文件中的列

python - 循环绘制直方图并并排显示

python - 从单个值 : Fast and readable method? 构建一个小的 numpy 数组