有没有办法通过软件将Ctrl + D发送到python stdin?

时间:2018-06-08 19:36:29

标签: python ply

我使用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的代码是什么,但它没有说如何发送它。

1 个答案:

答案 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本身的简单变体。)