Python - 脚本在 open() 函数上挂起
Python - script hangs on open() function
我有一个 Python 脚本,它首先杀死所有 hostapd
进程,然后启动一个新进程。我想捕获 hostapd
启动命令的输出以确定它是 returns AP-ENABLED
还是 AP-DISABLED
所以我决定将它写入一个临时文件然后读取它。
然而 open()
无限期挂起,或者直到我使用 ctrl-c;程序没有退出,而是吐出我预期的输出:
Line #0: Configuration file: /etc/hostapd/hostapd.conf
Line #1: Failed to create interface mon.wlan0: -95 (Operation not supported)
Line #2: wlan0: interface state UNINITIALIZED->COUNTRY_UPDATE
Line #3: wlan0: Could not connect to kernel driver
Line #4: Using interface wlan0 with hwaddr b8:27:eb:35:34:de and ssid "Coriolis"
Line #5: random: Only 6/20 bytes of strong random data available from /dev/random
Line #6: random: Not enough entropy pool available for secure operations
Line #7: WPA: Not enough entropy in random pool for secure operations - update keys later when the first station connects
Line #8: wlan0: interface state COUNTRY_UPDATE->ENABLED
Line #9: wlan0: AP-ENABLED
代码:
import subprocess
import os
import sys
def start_hostapd():
# kill any existing hostapd process
subprocess.call(['killall', 'hostapd'])
# start new hostapd process
os.system('hostapd /etc/hostapd/hostapd.conf > ./hostapd.log')
# capture the output
line_num = 0
with open('hostapd.log', 'r') as file:
for line in file:
print('\nLine #{}: {}'.format(line_num, line))
line_num += 1
# sys.stdout.flush()
if __name__ == '__main__':
start_hostapd()
我尝试添加 sys.stdout.flush()
但无济于事。
你试过把flush = True
加到打印函数里吗,也许是这样的
好的,我会向您解释为什么您在这里遇到问题。
所以hostapd
是守护进程(看名字最后的d,大多数linux守护进程都有)。
所以你正试图用 os.system
启动这个守护进程。在文档中,我检查了这个函数是否会生成并且 return 是进程 return code。
但是要获得 return 代码,os.system
必须等待守护进程完成。
所以这就是它挂在这里的原因。
作为解决方案。我建议生成带有一些无等待功能的守护进程,例如带有 os.P_NOWAIT
标志的 os.spawn
。
我有一个 Python 脚本,它首先杀死所有 hostapd
进程,然后启动一个新进程。我想捕获 hostapd
启动命令的输出以确定它是 returns AP-ENABLED
还是 AP-DISABLED
所以我决定将它写入一个临时文件然后读取它。
然而 open()
无限期挂起,或者直到我使用 ctrl-c;程序没有退出,而是吐出我预期的输出:
Line #0: Configuration file: /etc/hostapd/hostapd.conf
Line #1: Failed to create interface mon.wlan0: -95 (Operation not supported)
Line #2: wlan0: interface state UNINITIALIZED->COUNTRY_UPDATE
Line #3: wlan0: Could not connect to kernel driver
Line #4: Using interface wlan0 with hwaddr b8:27:eb:35:34:de and ssid "Coriolis"
Line #5: random: Only 6/20 bytes of strong random data available from /dev/random
Line #6: random: Not enough entropy pool available for secure operations
Line #7: WPA: Not enough entropy in random pool for secure operations - update keys later when the first station connects
Line #8: wlan0: interface state COUNTRY_UPDATE->ENABLED
Line #9: wlan0: AP-ENABLED
代码:
import subprocess
import os
import sys
def start_hostapd():
# kill any existing hostapd process
subprocess.call(['killall', 'hostapd'])
# start new hostapd process
os.system('hostapd /etc/hostapd/hostapd.conf > ./hostapd.log')
# capture the output
line_num = 0
with open('hostapd.log', 'r') as file:
for line in file:
print('\nLine #{}: {}'.format(line_num, line))
line_num += 1
# sys.stdout.flush()
if __name__ == '__main__':
start_hostapd()
我尝试添加 sys.stdout.flush()
但无济于事。
你试过把flush = True
加到打印函数里吗,也许是这样的
好的,我会向您解释为什么您在这里遇到问题。
所以hostapd
是守护进程(看名字最后的d,大多数linux守护进程都有)。
所以你正试图用 os.system
启动这个守护进程。在文档中,我检查了这个函数是否会生成并且 return 是进程 return code。
但是要获得 return 代码,os.system
必须等待守护进程完成。
所以这就是它挂在这里的原因。
作为解决方案。我建议生成带有一些无等待功能的守护进程,例如带有 os.P_NOWAIT
标志的 os.spawn
。