2012-10-24 75 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