用python改变进程状态

时间:2011-10-11 08:04:42

标签: python

我想搜索一个进程并显示它,例如emacs,我使用

`p = subprocess.Popen('ps -A | grep emacs',shell=True,stdout=subprocess.PIPE)` 

要获得该过程,那么我该如何将其唤醒并显示出来?

换句话说,问题应该是:python如何改变进程的状态?

2 个答案:

答案 0 :(得分:2)

简而言之,python有一个 pty 模块并在那里寻找解决方案。

这个问题并不像看起来那么简单。

通过提供相应的信号来改变流程的运行状态很简单,但操作前景/背景属性并不简单。

当我们谈论操纵前景/后台流程时,我们真的谈论'工作控制'。在UNIX环境中,作业控制是通过协调几个部分来实现的,包括内核,控制终端,当前shell以及在该shell会话中调用的几乎每个进程。告诉过程回到前台,你必须告诉别人闭嘴并同时转到后台。见

让我们回到你的问题。可能有2个答案,一个是没有办法,另一个是可以完成但是如何。

为什么有2个答案?

一般情况下,除非你为它编程,否则你无法控制工作。您也不能使用简单的管道来实现导致作业控制机制的协调模型;原因很重要,因为你无法通过管道传递信号。这就是为什么答案是不可能的,至少在简单的管道实现中没有办法。

但是,如果你有足够的耐心来编程终端I / O,那么仍然可以通过大量的人力工作来完成。概念很简单:你欺骗你的奴隶程序,在这个例子中是emacs,它已被附加到具有真正键盘和实体监视器待机的真实终端,并且你准备你的主程序,即python脚本,到处理并将必要的事件从其控制终端转发到从属的伪终端。

许多终端仿真器实际上采用了这种模式。你需要在你的情况下编写另一个终端模拟器......等等!是否必须付出这么多努力?

幸运的是没有。

您的shell在交互式场景中为您管理所有内容。你只需告诉shell' fg / bg '这个任务,在现实生活中很容易。指定的命令组合可以在shell的联机帮助页中找到。它可能看起来像' jobs -l | grep emacs '以及' fg%1 '。尽管如此,程序无法调用这些组合命令。这是一个不同的故事,因为一个程序将启动一个新的shell来解释它的命令,这样一个新的shell无法控制旧的运行emacs,因为它没有这个特权。用键盘输入,然后在显示器上读出;这是一个互动的场景。

在自动化方案中,在使用作业控制设计之前要三思而后行,因为大多数自动化方案不需要作业控制架构。你需要一个编辑器和一个玩家,没关系,但是不要让它们保持“背景”并弹出“前景”。当他们完成任务时,他们最好退出。

但是如果您不幸在自动化程序中编写作业控制,请尝试编程伪终端主从I / O.它们看起来像一个复杂的IPC机制,它们的细节依赖于操作系统。然而,这是您问题的标准答案;虽然烦人,但我知道。

答案 1 :(得分:0)

您可以获取此过程生成的输出,读取标准输出描述符:

out = p.stdout.read()