Оба варианта 1 и 2 будут работать, но, о боже, во имя всего хорошего, избегайте использовать темы для этого! Вы столкнетесь с наихудшим из обоих миров: проблемы с блокировкой, и , исключение в графическом потоке все равно убьет всю программу (включая поток журналирования). Как кто-то еще упомянул, использование двух отдельных процессов для этого нормально. screen
- немного странный выбор инструментов для этой цели, так же как и написание кода вручную на python. Я просто переписал бы скрипт talk2controller как этот тривиальный:
stty -F /dev/tty.KeySerial1 19200 raw
cat </dev/tty.KeySerial1 >logfile
(Вы также можете использовать >>logfile
, если хотите, чтобы каждый запуск скрипта добавлялся к файлу, а не переписывался с нуля.)
Другой вопрос о том, можно ли читать программу из файла, пока кто-то другой пишет в него. Более конкретная версия этого вопроса: что, если строка журнала наполовину записана в то время, когда вы пытаетесь ее прочитать?
Ответ: вам разрешено делать это, но вы правы, вы не можете гарантировать, что строка не будет наполовину написана во время ее прочтения. (Если вы напишите собственную замену для cat
или screen
, вы на самом деле можете сделать эту гарантию, всегда записывая в файл, используя os.read()
вместо sys.stdout.write()
или print
.)
Однако эта гарантия все равно не нужна. Вам нужно только быть осторожным при чтении файла, и у вас никогда не будет проблем. По сути, неполная строка - это всего лишь строка, которая не заканчивается символом \n
новой строки. Таким образом:
for line in open('logfile'):
if not line.endswith('\n'): break
...handle valid line...
Поскольку символ \n
является последним, что пишется каждой строкой журнала, вы точно знаете, что если вы прочитали символ \n
, все до того, как оно было написано правильно.