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

标签 python input

我正在开发一个通过 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 的,但对我有用:

import atexit, termios
import sys, os
import time


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 或跨平台答案在这里:Non-blocking console input?

关于python - 从 sys.stdin 获取输入,非阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43462814/

相关文章:

Python 字符串以 # 开头

python - Pandas df 将值从一列拆分为自己的列

java - 无法从控制台获取完整的字符串输入

python - 有没有办法在字典的键值对中包含用户输入提示或 time.sleep() 函数?

image - 输入类型=图像名称和值未被 ie 和 opera 发送

c - 如何在 C 中解析输入?

java - 将输入值发送到 java 类

python - 反转数字三角形

python - 转到上一个用户输入是用户输入指定的字符串

python - 确保某个包的版本比版本 x 更新