заставить скрипт python вести себя так же, как linux cmd с соотв. к перенаправлению ввода / вывода - PullRequest
0 голосов
/ 28 октября 2019

У меня есть прога python, которую я хочу вести себя как linux cmd при выводе. Прога использует print (), и при запуске в строке cmd напечатанный материал хорошо виден на терминале. Когда я запускаю прогу с перенаправлением вывода bash в файл, файл остается пустым. В чем ошибка я делаю?

Печатная часть прог:

chktime = 0
chkper  = 10

while True:
    if time.time() - chktime > chkper:
        chktime = time.time() 
        diskusepct = get_asus_diskusepct()
        print('Asus tmpfs free: ' + diskusepct)
        if float(diskusepct) > 95.0:
            with open("asus_syslog.log", 'w') as sl:
                sl.write(get_asus_syslog())
    else:
        print('Wait')
        time.sleep(1)

Из строки cmd (как и ожидалось):

rpi4b:~/python $ ./asus_diskwatch_v1.0.py 
Asus tmpfs free: 1
Wait
Wait
Wait
Wait

С перенаправлением (неожиданно):

~/python $ ./asus_diskwatch_v1.0.py > asus_diskwatch.log &
[2] 4415
~/python $ cat asus_diskwatch.log
<nothing>

Обратная связь приветствуется.

Ответы [ 2 ]

1 голос
/ 28 октября 2019

То, что здесь происходит, это буферизация вывода. Когда вывод на печать направляется в файл, данные собираются определенное количество, пока они не будут записаны в файл. Если вы подождете достаточно долго, вы заметите, что в файле неожиданно появилось большое количество строк «Ожидание». (Если вы хотите проверить это, сделайте вывод длиной в несколько сотен символов, чтобы вам не пришлось так долго ждать). Смотрите этот вопрос о способах управления буферизацией: Отключить буферизацию вывода

0 голосов
/ 28 октября 2019

Чтобы решить вашу проблему, я считаю, что вам нужно сделать две вещи:

  • Вам нужно изменить режим записи с записи 'w', чтобы добавить 'a', поскольку режим записи перезаписываетсяболее ранние строки, в то время как в режиме добавления будут добавляться новые строки.

  • Необходимо установить размер буфера равным 1, поскольку размер буфера по умолчанию равен 8192.

Итак, ваш код должен выглядеть следующим образом:

chktime = 0
chkper  = 10

while True:
    if time.time() - chktime > chkper:
        chktime = time.time() 
        diskusepct = get_asus_diskusepct()
        print('Asus tmpfs free: ' + diskusepct)
        if float(diskusepct) > 95.0:
            with open("asus_syslog.log", 'a', buffering=1) as sl: # <-- changes here
                sl.write(get_asus_syslog())
    else:
        print('Wait')

Надеюсь, это решит вашу проблему!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...