簡體   English   中英

Python3在有限的時間內提示用戶輸入,如果用戶沒有響應則輸入默認值

[英]Python3 prompt user input for a limited time, then enter a default if user doesn't respond

Python3:我試圖允許用戶在給定的時間內將響應輸入到輸入中,但是在給定的時間后,如果他們沒有輸入任何內容,我想中止輸入並為其分配一個默認值存儲輸入的變量,或者在給定時間段后將默認值輸入到輸入語句中。

我試過這個:

from threading import Timer
timeout = 2
t = Timer(timeout, print, ["\nSorry, time is up"])
t.start()
answer = input("You have 2 seconds to answer:")
t.cancel()
print(answer)

來自不同的堆棧溢出帖子,但問題是,即使在執行最后一行並打印answer之后,解釋器仍會提示用戶輸入,這對我正在嘗試做的事情不起作用(基本上,一個命令行游戲需要在玩家不提供輸入時繼續運行,但在收到輸入時進行更新)。

做到這一點的最佳方法是什么? 我知道 python 並沒有真正的超時功能或類似的功能,但是有沒有辦法通過系統命令或模塊來實現這一點?

有幾種合理的方法(其中一些可能是 Unix 特定的):

  1. 讀取超時后可以killsubprocess中的輸入。 (許多函數,包括subprocess.run ,都接受timeout參數來自動執行此操作。)
  2. 使用alarm或類似方法向您自己的進程發送信號(並安裝引發異常的signal處理程序)。
  3. 讓另一個線程在超時后close正在讀取的描述符; 這聽起來很激烈,但通常說是可行的,只要您在使用dup2恢復之前沒有意外open關閉描述符上的文件。
  4. 使用非阻塞readselect等低級工具read select ——不幸的是,這將禁用readline類的好東西。

無論如何,您必須決定如何處理超時前輸入的不完整但非空的輸入。 默認情況下,終端驅動程序可能會將它無形地轉移到下一個輸入提示。

使用select調用可能是一種更簡單的方法。

import sys, select

print "You have ten seconds to answer!"

i, o, e = select.select( [sys.stdin], [], [], 10 )

if (i):
  print "You said", sys.stdin.readline().strip()
else:
  print "You said nothing!"

請參閱鍵盤輸入超時?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM