2012-10-24 113 views
0

问题是该进程没有启动。该对象被创建,但是有和没有过程。Popen混淆 - 重定向输出,方法不起作用

如果我在os.kill语句之前放了一个time.sleep(),我失去了控制权。该过程确实开始,但并未被杀死。另外,我的stdout丢失了。我输入的任何东西都没有出现(我想这也是空的)。我不得不关闭终端,打开一个新的,并手工杀掉该进程(从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的一些东西......

即使我在“打印airodump”之前放入Popen.wait(),它也会被绕过并打印对象地址。这个小小的怪癖让我深信,在理解发生的事情方面是不对的。

+0

你想要stdout去哪里?你说它已经丢失,但是你发送它'/ dev/null'。 –

+0

我不关心标准输出的位置,只是为了方便。我所需要的只是让airodump运行几秒钟,然后停止(终止进程),然后将功能返回到程序。 – ojef

+0

我所关心的只是生成的文件。我只觉得有趣的是,标准输出发送到null“继续” – ojef

回答

3

你应该尝试:

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

通知我已经更换了你的字符串命令列表,放弃了壳= True和标准输出的东西。 First shell = True使得一切都更难调试,所以你应该尝试没有它的运行,但为了做到这一点,你需要为你的命令使用一个不是字符串的列表。

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

+0

哦,我的。那工作。有人建议删除shell = true,但我没有意识到该命令必须在列表中(我收到了一条错误消息,不知道为什么)。谢谢很多先生 – ojef

+0

我会投它,但我的声誉太低 – ojef