prompt-toolkit 在空闲时终止程序
prompt-toolkit terminate program when idle
我正在尝试使用 prompt-toolkit
编写一个简单的命令行应用程序。它工作得很好,但是如果长时间没有输入,我想退出程序。事实证明这对我来说非常具有挑战性。
这里是一些伪代码,说明 cli 应用应该像这样工作:
from prompt_toolkit import PromptSession
import time
def execute(cmd):
# do long task
time.sleep(120)
if __name__ == '__main__':
s = PromptSession()
while True:
start_time = time.time()
cmd = s.prompt('>')
execute(cmd)
if time.time() - start_time > 60:
break
所以如果用户在过去 60 秒内没有发出命令,程序应该终止。但是,如果执行的命令超过 60 秒,则应仅在命令完成后 60 秒终止(并且不会发出新命令)。
我已经被第一点绊倒了。当 s.prompt
是 运行 时,我是否需要并行处理来检查时间?该命令还有一个 prompt_async
版本。我试了一下,但没有成功...
因此,我在 asyncio 文档中为我的问题找到了一个非常简单的答案,它正是我搜索的内容:asyncio.wait_for
。
解决方法在这里,仅作记录:
from prompt_toolkit import PromptSession
import asyncio
def execute(cmd):
# do long task
time.sleep(120)
if __name__ == '__main__':
s = PromptSession()
while True:
try:
cmd = await asyncio.wait_for(s.prompt_async('>'), timeout=60)
except asyncio.TimeoutError:
break
execute(cmd)
我正在尝试使用 prompt-toolkit
编写一个简单的命令行应用程序。它工作得很好,但是如果长时间没有输入,我想退出程序。事实证明这对我来说非常具有挑战性。
这里是一些伪代码,说明 cli 应用应该像这样工作:
from prompt_toolkit import PromptSession
import time
def execute(cmd):
# do long task
time.sleep(120)
if __name__ == '__main__':
s = PromptSession()
while True:
start_time = time.time()
cmd = s.prompt('>')
execute(cmd)
if time.time() - start_time > 60:
break
所以如果用户在过去 60 秒内没有发出命令,程序应该终止。但是,如果执行的命令超过 60 秒,则应仅在命令完成后 60 秒终止(并且不会发出新命令)。
我已经被第一点绊倒了。当 s.prompt
是 运行 时,我是否需要并行处理来检查时间?该命令还有一个 prompt_async
版本。我试了一下,但没有成功...
因此,我在 asyncio 文档中为我的问题找到了一个非常简单的答案,它正是我搜索的内容:asyncio.wait_for
。
解决方法在这里,仅作记录:
from prompt_toolkit import PromptSession
import asyncio
def execute(cmd):
# do long task
time.sleep(120)
if __name__ == '__main__':
s = PromptSession()
while True:
try:
cmd = await asyncio.wait_for(s.prompt_async('>'), timeout=60)
except asyncio.TimeoutError:
break
execute(cmd)