Popen混乱 - 重定向输出,方法不起作用

时间:2012-10-24 03:16:55

标签: python linux subprocess

问题是该过程尚未启动。该对象已创建,但存在并且没有进程。

如果我在os.kill语句之前放了一个time.sleep(),我就失去了控制权。该过程确实开始,但它没有被杀死。另外,我的标准丢失了。我输入的任何内容都没有出现(我猜它也会为空)。我必须关闭终端,打开一个新的终端,并手动终止进程(启动python并发出确切的命令完成工作,这很好知道)

airodump = subprocess.Popen('airodump-ng -w outputfile mon0',shell=True,stdout=open('/dev/null', 'w'), stderr=open('/dev/null', 'w'))
#time.sleep(5)
os.kill(airodump.pid, signal.SIGTERM)   # airodump-ng
#airodump.wait()
print airodump

我尝试过调用Popen.terminate(),Popen.kill()方法。我和Popen错过了什么......

即使我在“print airodump”之前输入了Popen.wait(),它也会被绕过并打印出对象地址。这个小小的怪癖让我确信在我理解正在发生的事情上有些不对劲。

1 个答案:

答案 0 :(得分:3)

你应该尝试:

airodump = subprocess.Popen(['airodump-ng', '-w', 'outputfilename', 'mon0'],
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
time.sleep(secs)
airodump.terminate()
return_code = airodump.wait()

注意我已经用一个列表替换了你的字符串命令,删除了shell = True和stdout东西。第一个shell = True会使一切变得更难调试,所以你应该尝试在没有它的情况下运行它,但为了做到这一点,你需要使用一个列表来为你的命令而不是一个字符串。

捕获stdout / stderr并阻止它们进入屏幕的更标准方法是使用stdout=subprocess.PIPE。如果您仍然无法按照预期的方式工作,请尝试检查airodump.stdout和airodump.sterr以查看您的流程发生了什么。希望这足以让你开始。