您好我正在尝试输出
airodump-ng mon0
其中mon0是我的无线接口的监控模式。 我想连续读取命令的输出,而不会在某个时间间隔内杀死进程
我的代码如下:
import subprocess
import time
airodump = subprocess.Popen(['airodump-ng','mon0'],stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True
)
for i in [1, 2, 3, 4 ,5]:
time.sleep(10)
o_file = airodump.stdout
x = o_file.read()
print(x)
airodump.kill()
程序似乎停留在 x = o_file.read()。 请帮忙。
答案 0 :(得分:0)
设置stdout=subprocess.PIPE
和stderr=subprocess.PIPE
时存在死锁风险(除非您使用communicate
同时读取两个通道),因为如果进程写入标准错误并且您是试图读取标准输出,两者都永远阻止。
在您的情况下,您想要控制阅读,因此communicate
不是一个选项。我怀疑你只想合并两个流,所以改变:
stderr=subprocess.PIPE
通过
stderr=subprocess.STDOUT
将标准错误重定向到标准输出,并在o_file.stdout
除此之外:for i in [1, 2, 3, 4 ,5]:
会更像“pythonic”,如:for _ in range(5):
,因为你没有使用i
,并且还想象你想要循环10000次:)
但如果您的应用程序在所有情况下都不会立即打印行,那么这并不能解决您的问题,因为read()
正在阻止,并且您需要它在您想要时完全停止,所以我会:
True
&终止流程像这样:
import subprocess
import time
import threading
stop_output = False
def f(p):
global stop_output
while True:
l = p.stdout.readline()
if not l or stop_output:
break
print(l.rstrip()) # or whatever you want to do with the line
airodump = subprocess.Popen(['airodump-ng','mon0'],stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True
)
t = threading.Thread(target=f,args=(airodump,))
t.start()
time.sleep(10)
# kill the process and stop the display after 10 seconds whatever happens
airodump.terminate()
stop_output = True