当前位置: 首页 > 面试题库 >

捕获从Python调用的程序的“所有”终端输出

司徒胤
2023-03-14
问题内容

我有一个程序可以执行为

./install.sh

这将安装一堆东西,并且屏幕上发生了很多活动。

现在,我正在尝试通过执行

p = subprocess.Popen(executable, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()

希望所有发生在屏幕上的活动都被捕获在out(或err)中。但是,在进程运行时,内容直接打印到终端,而不会捕获到out或中err,在进程运行后,它们都为空。

这里会发生什么?如何捕获此内容?


问题答案:

通常,您所做的已经足以将所有输出传递到变量。

一个例外是,如果您正在运行的程序/dev/tty用于直接连接到其控制终端,并通过该终端而不是通过stdout(FD 1)和stderr(FD
2)发出输出。通常对安全敏感的IO(例如密码提示)执行此操作,但很少看到。

为了证明这一点有效,您可以将以下代码完全复制并粘贴到Python shell中:

import subprocess
executable = ['/bin/sh', '-c', 'echo stdout; echo stderr >&2']
p = subprocess.Popen(executable, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
print "---"
print "output: ", out
print "stderr: ", err

……相反,为了证明该案例 无效

import subprocess
executable = ['/bin/sh', '-c', 'echo uncapturable >/dev/tty']
p = subprocess.Popen(executable, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
print "---"
print "output: ", out

在这种情况下,内容将直接写入TTY,而不是stdout或stderr。不使用提供伪造TTY的程序(例如scriptexpect)就无法捕获此内容。因此,使用script

import subprocess
executable = ['script', '-q', '/dev/null',
              '/bin/sh', '-c', 'echo uncapturable >/dev/tty']
p = subprocess.Popen(executable, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
print "---"
print "output: ", out


 类似资料:
  • 我正在从终端运行我的Java程序,我试图使用我的代码中的linux命令来计算某个目录中的文件数量;我已经设法获得了除此之外的所有其他命令的输出。 我的命令是: 当我在代码中运行命令时,它似乎没有任何输出,但当我在终端中运行相同的命令时,它工作正常,并实际输出该目录中的xml文件数。 这是我的代码: 更新代码,带输出 输出:

  • 我现在正在做一个项目,将字符串传递到这个NLP API中,该API返回字符串情感分析的JSON对象。我承认我是Python新手: http://text-processing.com/docs/sentiment.html 通过命令行调用API的留档很简单。当我打开终端并运行命令时,它可以正常工作。 在终端上运行该命令会产生: 我试图在Python中找到一种方法来使用相同的命令进行终端调用,并捕获

  • 问题内容: 在Linux下的python 2.6中,我可以使用以下命令来处理TERM信号: 除了仅一次设置一个信号,是否可以为该过程接收的所有信号设置处理程序? 问题答案: 您可以循环浏览信号模块中的信号并进行设置。

  • 问题内容: 我正在使用对对象执行某些操作的Python库 并更改它。这样做时,它会向stdout打印一些统计信息,我希望掌握这些信息。正确的解决方案是更改以返回相关信息, 但是开发人员需要一段时间才能解决此问题。作为一种解决方法,我考虑过解析对stdout的任何写入。 如何捕获代码中两点之间的stdout输出,例如 ? 问题答案: 试试这个上下文管理器: 用法: 现在是一个包含函数调用打印的行的列

  • 问题内容: 我对如何从ssh等终端子进程发送输入和接收输出有疑问。 我在Golang中找不到一个简单的示例,其工作原理与上述类似。 在Golang中,我想做这样的事情,但是似乎不起作用: 然而; 我不确定如何执行此操作,因为每次执行此ssh命令时,我只能获取输出。我无法通过代码自动输入密码。有没有人写过ssh等终端进程的示例?如果是这样,请分享。 问题答案: 由于上面的评论,我可以使用密码使用ss

  • 我想知道列出安装在手机上的所有Twitter客户端是否可行。起初,我认为可以通过将包名与“Twitter”匹配来实现。但Android上的大多数Twitter客户端的软件包名称中都没有“Twitter”名称。 我们可以获取具有特定权限的应用程序列表,但这对我没有帮助。获取具有特定自定义意图的应用程序可能也不会有帮助,我仍然需要找到一种方法来获取处理自定义意图的应用程序列表。 这似乎不可行,但一定有