Python - скрипт зависает на функции open () - PullRequest
0 голосов
/ 03 октября 2018

У меня есть скрипт Python, который сначала убивает все процессы hostapd, затем запускает новый.Я хочу захватить выходные данные команды запуска hostapd, чтобы определить, возвращает ли она 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(), но безрезультатно.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

ОК, поэтому я объясню Вам, почему у Вас возникли проблемы.

Итак, hostapd - это процесс демона (посмотрите на последний d в названии, у большинства демонов linux он есть).

Итак, вы пытаетесь запустить этого демона с os.system.В документации я проверил, что эта функция порождает и возвращает процесс код возврата .Но чтобы получить код возврата, os.system должен дождаться завершения работы демона.Вот почему это висит здесь.

Как решение.Я предлагаю порождать демона без какой-либо функции ожидания, например, os.spawn с флагом os.P_NOWAIT.

0 голосов
/ 03 октября 2018

Вы пытались добавить flush = True к функции печати, возможно, она работает так

...