12

我正在研究一些脚本(在我工作的公司中),这些脚本被加载/卸载到管理程序中,以便在事件发生时触发一段代码。实际卸载脚本的唯一方法是点击Ctrl- C。我正在用 Python 编写一个函数来自动化这个过程

一旦它"done"在程序的输出中看到字符串,它应该终止vprobe. 我subprocess.Popen用来执行命令:

lineList = buff.readlines()
cmd = "vprobe /vprobe/myhello.emt"
p = subprocess.Popen(args = cmd, shell=True,stdout = buff, universal_newlines = True,preexec_fn=os.setsid)
while not re.search("done",lineList[-1]):
        print "waiting"
os.kill(p.pid,signal.CTRL_C_EVENT)

如您所见,我正在以buff读写模式打开的文件描述符中写入输出。我检查最后一行;如果有'done',我杀了它。不幸的是,CTRL_C_EVENT它仅对 Windows 有效。我能为 Linux 做些什么?

4

3 回答 3

11

我认为您可以发送 Linux 等效项signal.SIGINT(中断信号)。

(编辑:我曾经在这里有一些东西不鼓励使用这种策略来控制子进程,但是仔细阅读后,听起来你已经决定在这种特定情况下需要 control-C ......所以,SIGINT 应该这样做.)

于 2012-10-23T06:21:07.840 回答
5

在 Linux 中,可以使用 Popen.send_signal(signal.SIGINT) 函数以编程方式将 Ctrl-C 键盘中断发送到进程。例如

import subprocess
import signal

..
process = subprocess.Popen(..)
..
process.send_signal(signal.SIGINT)
..

不要使用 Popen.communicate() 来阻止命令..

于 2015-07-24T18:03:14.303 回答
4

也许我误解了一些东西,但是你这样做的方式很难得到想要的结果。

不管buff是什么,你首先查询它,然后在上下文中使用它,Popen()然后你希望通过 macivlineList填充自己。

你可能想要的是类似的东西

logfile = open("mylogfile", "a")
p = subprocess.Popen(['vprobe', '/vprobe/myhello.emt'], stdout=subprocess.PIPE,  buff, universal_newlines=True, preexec_fn=os.setsid)
for line in p.stdout:
    logfile.write(line)
    if re.search("done", line):
        break
    print "waiting"
os.kill(p.pid, signal.CTRL_C_EVENT)

这为您提供了一个由vprobe脚本馈送的管道末端,您可以逐行读出并根据找到的输出采取适当的行动。

于 2012-10-23T07:12:03.067 回答