我有一个以下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'......等等}
非常感谢您的帮助和时间
答案 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)