Python 测试条件不工作
我正在使用python与select和system library,代码如下:Python 测试条件不工作,python,select,timeout,sys,Python,Select,Timeout,Sys,我正在使用python与select和system library,代码如下: from __future__ import (absolute_import, division, print_function, unicode_literals) from select import select import sys def main(): timeout = 5 print('Please type something
from __future__ import (absolute_import, division,
print_function, unicode_literals)
from select import select
import sys
def main():
timeout = 5
print('Please type something: ', end = '')
sys.stdout.flush()
rlist, wlist, xlist = select([sys.stdin],[],[], timeout)
k=sys.stdin.readline()
if k=="f":
data = sys.stdin.readline()
print('you entered', data)
else:
print('\nSorry, {} seconds timeout expired!'.format(timeout))
print(k) #see the sys.stdin result
if __name__ == '__main__':
main()
此程序等待用户输入字符
如果用户在5秒钟后输入一个字符,那么程序也会停止,如果用户给出了与“f”字符不同的字符,但是问题是,这个条件不起作用,我会进行一次测试,以查看sys.stdin
值的结果,他会给我一个“f”字符,但是当我在if语句中输入结果时,程序不会工作
此结果的屏幕截图:
有人能告诉我这个结果的原因吗?我对
select
库不太了解。但这里有一个错误立刻引起了我的注意
使用k=sys.stdin.readline()
读取输入。这意味着k
将包含完整的行,包括\n
(换行符)符号。因此,如果按f+Enter
,k
的值将是“f\n”
,而不是“f”
。这就是为什么比较总是错误的原因
如果k.strip()=“f”:最好将这些值与进行比较
编辑
刚刚快速查看了select
库。如果要确定是否发生超时,则需要使用select函数的返回值。而不是直接从输入读取。否则,无论是否发生超时,您都将等待
我不确定您想要完成什么,但是类似于以下代码的东西可以工作
from __future__ import print_function
from select import select
import sys
timeout = 5
print('Please type something: ', end = '')
sys.stdout.flush()
inputready, _, _ = select([sys.stdin],[],[], timeout)
if inputready:
k = sys.stdin.readline()
if k.strip()=="f":
print("You printed 'f'")
else:
print("Not 'f'")
else:
print('\nSorry, {} seconds timeout expired!'.format(timeout))
是的,它工作正常谢谢我忘记了\n但是您的答案中不清楚为什么要添加int@Sekmani52“int”???你是说变量inputready吗?这是select的返回值之一。它告诉我们,是否有人写了输入。干得好。Sekmani52还没有足够的代表投票。。。但我知道@user38034很抱歉,我的笔记本电脑关机了,我没有编辑我的答案hhh我会更正我的评论我说为什么你要添加如果输入准备:
为什么不如果k.strip():
直接我正在我的机器中测试代码,没有如果输入准备:
我会工作,谢谢,是的helpful@Sekmani52好啊:-)如果输入已就绪:
实际上是最重要的事情。如果inputready==False
,则用户尚未写入任何内容。如果您只写k=sys.stdin.readline()
,它将等待用户实际写了什么。这当然不是你想要实现的。如果用户在前5秒内没有写入任何内容,则您不想读取输入,只想打印一条错误消息。至少这是我认为你想做的。