如何在不关闭程序的情况下关闭由python程序启动的子进程

时间:2014-12-16 18:55:48

标签: python shell unix command-line subprocess

我有一个以下python程序,它打开一个命令作为子进程并显示其输出。此命令虽然在显示信息后等待用户输入。另一方面,我希望获取该信息并关闭此子流程并返回正在执行的程序

程序就是这个

#!/usr/bin/python
from commands import *
import subprocess, os, sys, time

cmd = '/usr/local/bin/astrisctl reset'

p = subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE)
time.sleep( 5 )
p.kill()

out = p.stderr
if out == '' and p.poll() != None:
        print "No output from the commnand"
        sys.exit()
if out != '':
        sys.stdout.write(out)
        sys.stdout.flush()

print "i am back"

我想要像

这样的东西
something something
 0) xyz-0008E8
 1) xyz-000AB9
 2) xyz-000D18
 3) xyz-000D2B
 4) xyz-000E9D

pick a choice
i am back

但是就像

dta-rack-04:~ admin$ python Desktop/getBurnInLogs.py 
something something
 0) xyz-0008E8
 1) xyz-000AB9
 2) xyz-000D18
 3) xyz-000D2B
 4) xyz-000E9D
Choose a device: Traceback (most recent call last):
File "Desktop/getBurnInLogs.py", line 16, in <module>
sys.stdout.write(out)

但我希望

something something
 0) xyz-0008E8
 1) xyz-000AB9
 2) xyz-000D18
 3) xyz-000D2B
 4) xyz-000E9D

pick a choice
i am back

主要目的是不要等待那个选择。

另外,如果你能建议一个好方法让这个选项在列表中看起来像{'xyz-000E9D','xyz-000E9D'......等等}

非常感谢您的帮助和时间

1 个答案:

答案 0 :(得分:1)

如果您想发送SIGKILL,请使用

p.kill()

这应该立即杀死进程

如果你想等到它完成(听起来不像你那样),那就用

p.wait()

更新:如果输出来自stdout而不是stderr,你需要捕获它。既然你正在做一些奇怪的事情,你会想要让它无缓冲

p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0)

然后从p.stdout读取,小心处理。

您也可以轻松摆脱shell=True

cmd = ['/usr/local/bin/astrisctl', 'reset']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=0)