当前位置: 首页 > 面试题库 >

从sys.stdin获取输入,非阻塞

富勇军
2023-03-14
问题内容

我正在为比赛设计一个机器人,该机器人通过接收机器人的输入sys.stdin并使用Python的print()输出。我有以下内容:

import sys

def main():
    while True:
        line = sys.stdin.readline()
        parts = line.split()
        if len(parts) > 0:
            # do stuff

问题在于输入是通过流输入的,并且使用上述输入,使我无法打印任何内容,直到关闭流。我该怎么做才能使这项工作?


问题答案:

通过关闭屏蔽功能,您一次只能读取一个字符。因此,无法readline()在非阻塞上下文中工作。我假设您只是想阅读按键来控制机器人。

select.select()在Linux上没有运气,并创建了一种调整termios设置的方法。因此,这是特定于Linux的,但对我有用:

old_settings=None

def init_anykey():
   global old_settings
   old_settings = termios.tcgetattr(sys.stdin)
   new_settings = termios.tcgetattr(sys.stdin)
   new_settings[3] = new_settings[3] & ~(termios.ECHO | termios.ICANON) # lflags
   new_settings[6][termios.VMIN] = 0  # cc
   new_settings[6][termios.VTIME] = 0 # cc
   termios.tcsetattr(sys.stdin, termios.TCSADRAIN, new_settings)

@atexit.register
def term_anykey():
   global old_settings
   if old_settings:
      termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)

def anykey():
   ch_set = []
   ch = os.read(sys.stdin.fileno(), 1)
   while ch != None and len(ch) > 0:
      ch_set.append( ord(ch[0]) )
      ch = os.read(sys.stdin.fileno(), 1)
   return ch_set;

init_anykey()
while True:
   key = anykey()
   if key != None:
      print key
   else:
      time.sleep(0.1)

更好的Windows或跨平台答案在这里:Python非阻塞控制台输入



 类似资料:
  • 我的脚本在,然后调用,但最后一次调用无效。 这是我的剧本: 如果用户在命令行上指定了一个实际的文件参数,则脚本可以正常工作,但如果用户通过管道输入数据并使用: 我需要支持读取,然后是-我如何使它工作?

  • 问题内容: 我正在尝试用Python创建一个简单的IRC客户端(这是我学习该语言时的一个项目)。 我有一个循环,可以用来接收和解析IRC服务器发送给我的内容,但是如果我使用它raw_input来输入内容,它将停止循环,直到我输入某些东西为止(显然)。 如何在不停止循环的情况下输入内容? 提前致谢。 (我认为我不需要发布代码,我只想输入一些内容,而while 1循环不会停止。) 编辑:我在Windo

  • 问题内容: 我实际上尝试在600毫秒的时间内完成上述操作,此后它不应允许读取,但bufferedreader的readline阻塞了。请帮助 问题答案: 您可以使用BufferedReader.available()> 0检查是否有要读取的字符。

  • 我们在Hazelcast客户端中使用ReplicatedMap。客户端和服务器都是版本4.2.1。 地图很小( 我们期望ReplicatedMap.get是非阻塞的,但是在长时间运行的性能测试中,我们开始从vertx(监控阻塞线程)收到如下警告。第一个错误是在6小时后出现的,因此不容易复制。 有没有办法进行非阻塞get?或者我们需要添加EntryListener来维护ConcurrentHashm

  • 问题内容: 我正在将JSON解析为ExpandableListView,在每个孩子上,用户可以选择每个他希望拥有+/-按钮的孩子的数量。+/-按钮连接到TextView,其中显示每个孩子的总数,总费用将显示在该行的末尾。 在父级的底部,应该有一个TextView,其中包含在ExpListView的每个子级中计算出的所有值的摘要(摘要),并且底部的“确定”按钮应将每个子级的数量发送到服务器(已连接的

  • 问题内容: 我正在尝试使用Console类从用户获取输入,但是在调用时返回空对象。使用System.console之前我是否需要更改任何内容? 问题答案: 使用控制台读取输入(仅在IDE外部可用): 另一种方法(适用于所有地方): 因此,如果你真的需要使用