我正在为比赛设计一个机器人,该机器人通过接收机器人的输入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外部可用): 另一种方法(适用于所有地方): 因此,如果你真的需要使用