我使用lexer.input(sys.stdin.read())
能够在控制台中自由编写并在lexer中标记if,等等,但我想当有人写“退出”时它发送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的代码是什么,但它没有说如何发送它。
答案 0 :(得分:2)
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
本身的简单变体。)