Python 何时使用subprocess.call()或subprocess.Popen(),运行airodump

Python 何时使用subprocess.call()或subprocess.Popen(),运行airodump,python,subprocess,Python,Subprocess,我有一个小脚本,可以让你的无线设备进入监控模式。它执行airodump扫描,然后在终止扫描后将输出转储到file.txt或一个变量,这样我就可以刮取BSSID和我可能需要的任何其他信息 我觉得我还没有掌握subprocess.call()和subprocess.Popen()之间的概念或区别 这就是我目前拥有的: def setup_device(): try: output = open("file.txt", "w") put_device_down

我有一个小脚本,可以让你的无线设备进入监控模式。它执行airodump扫描,然后在终止扫描后将输出转储到file.txt或一个变量,这样我就可以刮取BSSID和我可能需要的任何其他信息

我觉得我还没有掌握
subprocess.call()
subprocess.Popen()之间的概念或区别

这就是我目前拥有的:

def setup_device(): 
    try:
        output = open("file.txt", "w")
        put_device_down = subprocess.call(["ifconfig", "wlan0", "down"])
        put_device_mon = subprocess.call(["iwconfig", "wlan0", "mode", "monitor"]) 
        put_device_up = subprocess.call(["iwconfig", "wlano", "up"])
        start_device = subprocess.call(["airmon-ng", "start", "wlan0"])
        scanned_networks = subprocess.Popen(["airodump-ng", "wlan0"], stdout = output)  
        time.sleep(10)  
        scanned_networks.terminate()

    except Exception, e:
         print "Error:", e
我仍然不知道在何处、何时以及以何种方式使用
subprocess.call()
subprocess.Popen()

我认为最让我困惑的是
stdout
stderr
args。什么是管道

一旦我更好地掌握了,我可能会解决的另一件事是:


运行subprocess.Popen()
并运行airodump时,控制台窗口弹出显示扫描。有没有一种方法可以对用户隐藏此信息,以便进行清理?

如果不想,您不必使用
Popen()
。模块中的其他函数,如
.call()
使用
Popen()
,为您提供了一个更简单的API来完成所需的操作

所有控制台应用程序都有3个“文件”流:
stdin
用于输入,
stdout
stderr
用于输出。应用程序决定在何处写入内容;通常将错误和诊断信息发送至
stderr
,其余发送至
stdout
。如果要在Python程序中捕获这些输出中的任何一个的输出,请指定
subprocess.PIPE
参数,以便将“流”重定向到程序中。因此得名

如果要捕获
airodump ng wlan0
命令的输出,最容易使用该函数;它为您处理
管道
参数:

scanned_networks = subprocess.check_output(["airodump-ng", "wlan0"])
现在,
output
包含写入其
stdout
流的任何
airodump ng

如果需要对流程进行更多控制,则需要使用
Popen()
类:

proc = subprocess.Popen(["airodump-ng", "wlan0"], stdout=subprocess.PIPE)
for line in proc.stdout:
    # do something with line
proc.terminate()

谢谢你的详细答复。我以前尝试过在扫描中使用check_输出,但不得不求助于Popen(),因为我的扫描将无限运行,直到我在终端中手动按下ctrl-c,它才会运行,因为我相信只有Popen()有terminate()方法?如果我是,请纠正我wrong@JakePoulter:事实上,如果
airdump ng
一直运行到终止,则需要使用
Popen()
并将
stdout
重定向到python程序。我举了一个例子,再次感谢你的回复。我知道它是如何工作的,但这使脚本进入无限循环,因为airodump一直运行,直到您手动停止进程,因此使for循环继续写入行您必须决定何时从管道中读取足够的内容并停止进程;我不知道你在这里找什么。:-)一旦你有了你需要的,使用
break
结束循环。