python子流程模块是否古怪?

python子流程模块是否古怪?,python,linux,subprocess,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:

今天早些时候,这段代码按照我的要求工作。现在没有了。我希望它运行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是令人担忧的,早些时候我得到了1,但这个过程仍然会死亡,这是所有重要的,但不是由于os.kill语句,这是wierd。但这不是大问题。我所需要的就是那个.csv文件。在这个实现中,csv文件是完全空的——它是生成的,但从未放入任何内容。如果我在未将标准输出设置为管道的情况下运行子流程,则会创建并填充csv文件,但我不能这样做-但我必须将标准输出保留在屏幕之外


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

由于您将输出发送到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())

很难用示例代码重现机器上发生的情况。但有一件事可能会导致一些问题:如果您实际上打算从管道中读取数据,则只应使用
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,您可以使用。

在我看来,
airodump.kill()
airodump.terminate()
应该交换
kill
发送SIGKILL,这是一个不确定的进程终止,而SIGTERM只是要求进程退出。这就是我想要的。是的,没有什么好的理由把它发送给pipe,我只是想让它远离屏幕。这就是我需要它做的一切,谢谢。不过,还有一件事。脚本完成后,我键入的任何内容都不会出现在屏幕上(我想会转到/dev/null)。我仍然可以运行命令,并且这些命令的输出会显示出来,只是我键入的文本不会出现?您如何运行脚本?从命令行、IDE或双击图标?您可能希望创建另一个SO问题,因为答案可能并不简单。