python子进程模块是古怪的吗?

时间:2012-10-25 06:32:22

标签: python linux subprocess

今天早些时候,这段代码正如我所希望的那样工作。现在它没有。我希望它运行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文件是完全空的 - 它被制作但没有任何东西放入其中。如果我在没有将stdout设置为PIPE的情况下运行subprocess,则会创建并填充csv文件,但我不能这样做 - 我必须将stdout保持在屏幕外。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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())