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,但进程仍然死掉,这很重要,但不是因为 os.kill 语句,这很奇怪。不过这不是大问题。我只需要那个 .csv 文件。有了这个实现,csv 文件完全是空的——它被制作了,但没有任何东西放入其中。如果我在没有将标准输出设置为 PIPE 的情况下运行子进程,则会创建并填充 csv 文件,但我不能那样做——我必须将标准输出保持在屏幕之外。

stdout=subprocess.PIPE 是否导致数据被“写入”到 PIPE-land 中不存在的 csv 文件?

4

2 回答 2

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

于 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 回答