Python-脚本挂在open()函数上

时间:2018-10-03 14:37:17

标签: python raspberry-pi subprocess sys hostapd

我有一个Python脚本,该脚本首先杀死所有hostapd进程,然后开始一个新的进程。我想捕获hostapd启动命令的输出以确定它是否返回AP-ENABLEDAP-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(),但无济于事。

2 个答案:

答案 0 :(得分:1)

好的,所以我将向您解释为什么您在这里遇到问题。

所以hostapd是守护进程(请看名称中最后一个 d ,大​​多数linux守护进程都有它)。

因此,您正在尝试使用os.system启动此守护程序。在文档中,我检查了该函数是否产生并返回了返回代码的过程。 但是要获取返回代码,os.system必须等待守护程序完成。 这就是为什么它挂在这里。

作为解决方案。我建议生成带有一些没有等待功能的守护程序,例如带有os.spawn标志的os.P_NOWAIT

答案 1 :(得分:0)

您是否尝试过将flush = True添加到打印功能,也许它可以像这样