我需要在Python中将标准输入切换到非缓冲模式,以便我可以读取它的单个字符.我设法让它工作,但现在标准输出被打破:不知何故,似乎在换行符后,发出一些空格字符,第一行为零,第二行为3,第三行为6,等等,这样:
ASD
ASD
ASD
Run Code Online (Sandbox Code Playgroud)
操作系统是Ubuntu Linux 12.04,64位版本,Python版本是3.2.3.
我怎样才能摆脱这种行为呢?
以下是我用过的代码:
import sys
import tty
import termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
tty.setraw(sys.stdin)
for i in range(0, 10):
print("ASD")
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
Run Code Online (Sandbox Code Playgroud) 我需要在 Mac 和 Windows 上为 python 3 提供定时输入,如果用户没有时间,它会自动选择其中一个选项。我见过的问题的所有其他答案只有在用户按“Enter”键后才会终止。无论是否按下“Enter”键,我都需要它终止。
例如,在我的国际象棋程序中,如果5秒后没有输入,我需要它自动选择“Q”。另外,如果输入不在 [“Q”,“R”,“B”,“N”] 中,那么我还需要它来选择“Q”。
下面的代码不起作用。它会要求输入然后永远等待;计时器根本不工作。
def countdown():
global timer
timer = 5
for x in range(timer):
timer -= 1
time.sleep(1)
countdownThread = threading.Thread(target=countdown)
countdownThread.start()
while timer > 0:
promotedPiece = input("Promote to Q, R, B or N? > ").upper()
if timer == 0:
break
if timer == 0:
if promotedPiece not in ["Q", "R", "B", "N"]: # If not valid input, choose Queen
promotedPiece = "Q"
print("Queen auto selected")
Run Code Online (Sandbox Code Playgroud) python multithreading timer python-multithreading python-3.x
这可能是一个xy问题,但我正在尝试构建一个基于内核的文本编辑器,类似于vim或者nano,我知道如何使用转义字符清除屏幕,然后重新打印,我可以让它接受字符,但是我不知道如何让它接受箭头输入导航.我认为它们有ASCII值,但显然不是.有没有办法使用箭头,还是我必须进行导航模式和插入模式vim?
我也曾经简单地玩过curses,但这是令人望而却步的,因为据我所知,必须为它打开一个全新的窗口,这与我所拥有的单个终端窗口的视觉不兼容.
编辑:curses也是禁止,因为它清除了窗口,我不想要.
操作系统是 Redhat-clone Linux 发行版,我使用的是 python-2.x。
一般代码结构为:
# stuff is initialized
while True:
# read stuff from remote devices
# process data
# maybe do stuff, or maybe just watch
os.system("clear")
# display status of remote devices
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
我想让用户通过按各种键来驱动程序。例如“按 S 正常关闭远程设备,按 K 杀死,按 R 重新启动”。所有这些操作都需要在大循环内发生——我的伪代码中的“也许做些事情,或者只是看”注释。如果没有按下任何键,程序应该一直循环。
我不确定如何在 while True: time.sleep(1) 循环的上下文中完成键盘阅读。
我正在编写一个Python脚本来解析来自QR阅读器(系统被视为键盘)的输入.
目前我正在使用,raw_input()但此功能等待EOF /行尾符号,以便将收到的字符串提交给程序.我想知道是否有一种方法可以连续解析输入字符串,而不仅仅是在行末端限制的块中.
在实践中: - 在python中是否有一种方法可以异步并连续地解析控制台输入?- 有没有办法改变raw_input()(或等效函数)寻找另一个字符,以便将字符串读取提交到程序中?
我知道在 SO 上有很多类似的问题,比如这个或这个,也许还有更多,但似乎没有一个适用于我的特定情况。我对subprocess.Popen()工作原理缺乏了解也无济于事。
我想要实现的是:启动一个子进程(一个命令行收音机播放器),它也向终端输出数据,也可以接收输入——等待一段时间——终止子进程——退出shell。我在 OSX 10.9 上运行 python 2.7
案例 1. 这将启动广播播放器(但仅限音频!),终止进程,退出。
import subprocess
import time
p = subprocess.Popen(['/bin/bash', '-c', 'mplayer http://173.239.76.147:8090'],
stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=False,
stderr=subprocess.STDOUT)
time.sleep(5)
p.kill()
Run Code Online (Sandbox Code Playgroud)
案例 2. 这将启动收音机播放器,输出诸如收音机名称、歌曲、比特率等信息并接受输入。它终止子进程,但它从不存在 shell,即使使用“Ctrl-C”,终端也无法使用。
p = subprocess.Popen(['/bin/bash', '-c', 'mplayer http://173.239.76.147:8090'],
shell=False)
time.sleep(5)
p.kill()
Run Code Online (Sandbox Code Playgroud)
关于如何做到这一点的任何想法?我什至在想,如果没有其他选择,是否有可能为子进程打开一个slave-shell(当然这也是我不知道的事情)。谢谢!
假设我想在python中创建一个非常简单的程序,指示按下一个键的时间.因此,如果我键入并按住j键片一会儿,我正在寻找一个能够显示信息的程序the key 'j' was pressed for 1.1 seconds.
根据我的理解,应该实现的方式是检测KEYDOWN事件和KEYUP事件并对其加时间戳,并对时间戳进行适当的减法.因此,检测KEYDOWN和KEYUP事件就足够了.
关于检测单个按键或检测单个字符输入的SO有各种各样的问题和答案,例如这一个或这个,它们都使用某种形式的getch.我查看了python curses库,从我可以看出,密钥检测的主要形式也是单字符getch()的形式.但是这些没有检测到按键的长度 - 它们只检测KEYDOWN.
我认识到检测按键的长度是游戏中的必要任务,所以我希望pygame有方法来检测按键持续时间.但我希望可以使用更纤薄,更直接的库来检测按键持续时间.
首先,我对Python完全陌生,刚刚开始学习它。我知道很多关于 C++ 的东西,但我只是尝试用 Python 实现其中一些。
我已经对其进行了大量搜索,但找不到任何符合我要求的解决方案。请看下面的代码,
import os
class _Getch:
"""Gets a single character from standard input. Does not echo to the
screen."""
def __init__(self):
try:
self.impl = _GetchWindows()
except:
print("Error!")
def __call__(self): return self.impl()
class _GetchWindows:
def __init__(self):
import msvcrt
def __call__(self):
import msvcrt
return msvcrt.getch()
def mainfun():
check = fh = True
while check:
fh = True
arr = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
print ("Welcome to Tic Tac Toe Game!!!\n\n")
print("Enter 1 to …Run Code Online (Sandbox Code Playgroud) 许多编码挑战在同一行中有多个数字,通常第一行告诉多数字行中有多少个数字:
4
31 415 9 26
Run Code Online (Sandbox Code Playgroud)
通常我只是读取整行,然后.split()将字符串映射到数字。
但是有没有一种好方法可以不一次读取整行,而是一次读取一个数字呢?为了节省内存,要么因为我不能或不想将整行读入内存。我只想使用 O(1) 空间(假设数字很小/有界,所以它们的大小是 O(1) )。不必绝对最小,例如,如果解决方案在内部一次读取完整的 4 KB 内存页,那没关系,仍然是 O(1) 并且相对较小。对于用例,请考虑一行上有数百万个数字,并且内存限制比方说低于 1 MB。
在 C++ 中我会这样做:
4
31 415 9 26
Run Code Online (Sandbox Code Playgroud)
我编写了这个生成器,它接受一个文件对象并为我提供一个字符串迭代器。对于上面的示例,它生成字符串'4'、'31'、'415'和'9'。'26'它一次读取一个字符,并按照以下确定的空格字符进行分割.isspace():
def split(file):
value = []
while char := file.read(1):
if char.isspace():
if value:
yield ''.join(value)
value.clear()
else:
value.append(char)
if value:
yield ''.join(value)
Run Code Online (Sandbox Code Playgroud)
但这当然是极其复杂和缓慢的,我什至不知道这种str.isspace用法是否等同于str.split空白。它只是说明了实现我想要的目标的一种方法。
编辑:这是一种更简单的方法,但仍然比我想要的更复杂和缓慢。我正在寻找一些内置的方法,以 …
我有一个脚本应该与用户输入交互(按箭头键),但我无法获取按键。我尝试了 raw_input 和其他一些函数,但它们不起作用。这是我的示例代码,它应该是什么样子(可以在另一个函数中将运行 bool 设置为 False)
running = True
while running:
#if input == Arrow_UP:
# do_Sth
#elif ...
display()
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
另一个问题是,如何每秒只调用一次显示函数,但立即对输入做出反应?
python ×10
python-3.x ×2
buffering ×1
console ×1
getchar ×1
keypress ×1
linux ×1
memory ×1
menu ×1
raw-input ×1
stdin ×1
subprocess ×1
text-editor ×1
timer ×1
user-input ×1