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文件???
答案 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())