Есть ли способ отправить Ctrl + D через программное обеспечение в Python Stdin? - PullRequest
0 голосов
/ 08 июня 2018

Я использую lexer.input(sys.stdin.read()), чтобы иметь возможность писать в консоли свободно и токенизировать if's, for´s и т. Д. В lexer, но я хочу, чтобы, когда кто-то пишет "exit", он посылал CTRL + D, поэтому sys.stdin.read () прекратить чтение и завершить мою программу.Попытка сделать это в моем коде:

lexer.input(sys.stdin.read())
for tok in lexer:
    if tok.value == "exit":
        sys.stdin.read(0o4)

Но это не выход.004 потому что на этой странице https://mail.python.org/pipermail/python-list/2002-July/165325.html они говорят, что это код для CTRL + D, но не говорят, как его отправить.

1 Ответ

0 голосов
/ 09 июня 2018

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.)

...