sys.stdin.read()
будет читать все stdin перед возвратом, поэтому функция ввода в
lexer.input(sys.stdin.read())
не может быть преждевременно прервана с помощью чего-либо, сделанного внутри лексера.Весь ввод был прочитан до того, как lexer.input
даже был вызван.
Вы можете прочитать до (но не включая) первую строку, содержащую exit
со следующим:
from itertools import takewhile
lexer.input(''.join(takewhile(lambda line: 'exit' not in line, sys.stdin)))
хотя я лично предпочел бы что-то вроде
from itertools import takewhile
notdone = lambda line: not line.lstrip().startswith('exit')
lexer.input(''.join(takewhile(notdone, sys.stdin)
Это не будет смущено строками, которые случайно содержат exit
в середине чего-либо, но все равно остановится, если попадет в строку, чья перваяСлово только начинается с exit
.(К счастью, в стандартном английском языке единственными такими словами являются простые варианты самого слова exit
.)