2012-10-25 35 views
0

今天早些時候,這段代碼工作,因爲我想它。現在它不。我希望它運行airodump並將輸出存儲到csv文件(命令行選項)。幾秒鐘後殺死這個過程。是python子流程模塊古怪嗎?

def find_networks(): 
airodump = subprocess.Popen(["airodump-ng","-w","airo","--output-format","csv","mon0"],stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
time.sleep(10) 
try: 
    os.kill(airodump.pid, signal.SIGTERM) 
    if not airodump.poll(): 
     print "shouldn't have had to do this.." 
    airodump.kill() 
    if not airodump.poll(): 
     print "shouldn't have had to do this....." 
    airodump.terminate() 
    if not airodump.poll(): 
     print "shouldn't have had to do this........" 
except OSError: 
    print "?" 
    pass 
except UnboundLocalError: 
    print "??" 
    pass   
return_code = airodump.wait() 
print return_code 

(這裏的輸出是: 不應該有這樣做.. 不應該有這樣做..... -9)

此前它會做正是我所說的(相同的代碼)。負面9令人擔憂,早些時候我得到1,但這個過程仍然會死亡,這是非常重要的,但不是由於os.kill聲明,這是很奇怪的。但這並不是什麼大問題。我需要的是.csv文件。在這個實現中,csv文件是完全空的 - 它是被創建的,但沒有任何東西放入它。如果我運行沒有設置爲PIPE的stdout的子進程,csv文件被創建並填充,但是我不能這麼做 - 我必須將stdout保留在屏幕之外。

stdout = subprocess.PIPE導致數據「寫入」PIPE-land中不存在的csv文件?

+0

在我看來''airodump.kill()'和'airodump.terminate()'應該交換。 'kill'發送了SIGKILL,這個進程終止了,而SIGTERM只是要求進程退出。 –

回答

1

用你的示例代碼很難重現你的機器上發生了什麼。有一件事可能會導致一些問題:如果您實際上打算從管道中讀取數據,則只應使用stdout=subprocess.PIPE。如果你不這樣做,一旦它產生足夠的輸出來填充管道緩衝區,進程就會阻塞。

如果你想要做的是隱藏輸出和錯誤,你可以這樣做:

airodump = subprocess.Popen(..., stdout=open("/dev/null", "w"), stderr=open("/dev/null", "w")) 

或者更好的是:

import os 
airodump = subprocess.Popen(..., stdout=open(os.devnull, "w"), stderr=open(os.devnull, "w")) 

或者,如果你正在使用Python 3,你可以使用subprocess.DEVNULL

+0

這就是我一直在尋找的東西。是的,沒有任何理由將它發送給管道,我只是試圖將其保持在屏幕之外。所以我做了所有我需要的事情,謝謝。儘管如此,還有另外一件事。腳本完成後,我輸入的任何東西都不會出現在屏幕上(去/ dev/null我想)。我仍然可以運行命令,這些命令的輸出顯示出來,只是輸入的文本不會出現? – ojef

+0

你如何運行你的腳本?從命令行或IDE中,或者雙擊一個圖標?您可能想要創建另一個SO問題,因爲答案可能並不簡單。 – del

0

由於您將輸出發送到PIPE,因此如果需要,您應該明確地讀出它,然後可以將其寫入本地文件。像:

airodump = subprocess.Popen(["airodump-ng","-w","airo","--output-format","csv","mon0"],stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
... # wait the command to complete 
open("the_file_you_want_to_store_output", "w").write(airodump.stdout.read())