0

今日、このコードは私が望んでいたように機能しました。今はそうではありません。airodump を実行し、出力を csv ファイルに保存したい (コマンド ライン オプション)。数秒後、プロセスを強制終了します。

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 を取得していましたが、プロセスはまだ終了しています。しかし、それは大きな問題ではありません。必要なのはその .csv ファイルだけです。この実装では、csv ファイルは完全に空です。作成されますが、何も挿入されません。stdout を PIPE に設定せずにサブプロセスを実行すると、csv ファイルが作成されて入力されますが、そのようにすることはできません。

stdout=subprocess.PIPE により、データが PIPE ランドの存在しない csv ファイルに「書き込まれる」ことはありますか?

4

2 に答える 2

1

サンプル コードを使用してマシンで何が起こっているかを再現することは困難です。ただし、いくつかの問題を引き起こしている可能性があることの 1 つ:stdout=subprocess.PIPE実際にパイプから読み取るつもりである場合にのみ使用してください。そうしないと、パイプ バッファがいっぱいになるだけの出力が生成されると、プロセスはブロックされます。

stdout と stderr を非表示にするだけの場合は、次のようにします。

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を使用できます。

于 2012-10-25T06:49:20.777 に答える
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())
于 2012-10-25T06:48:18.150 に答える