繁体   English   中英

用python改变进程状态

[英]change process state with python

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

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

为了得到这个过程,我该如何将其唤醒并显示出来?

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

简而言之,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机制,它们的细节依赖于操作系统。 然而,这是您问题的标准答案; 虽然烦人,但我知道。

你可以获得这个过程生成的输出,读取stdout描述符:

out = p.stdout.read()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM