- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我试图在不等待输入的情况下读取键盘输入。目的是在“无限”循环中使用,也就是 while True:
。
到目前为止,我一直在尝试操作 readchar
库 https://pypi.python.org/pypi/readchar/0.6 ,但没有运气。虽然它不等待 Enter
,但它仍会等待一些输入。我不希望它等待输入,而只是检查并返回 ""
或一些占位符(如果没有输入)。
这是我一直在使用的:
def readchar():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
def main():
while True:
current = readchar()
if current == "some letter":
print("things happen")
最佳答案
最终构成 Python 文件对象基础的 POSIX I/O 函数有两种不同的模式,阻塞和非阻塞,由名为 O_NONBLOCK
的标志控制。 .特别是 read
功能说:
When attempting to read a file … that … has no data currently available … If
O_NONBLOCK
is set, read() shall return -1 and set errno to[EAGAIN]
.
在 Python 中,这个标志在 os
中可用。模块。
sys.stdin
已经打开,所以你不能只将 O_NONBLOCK
传递给 os.open
函数,所以……怎么办你做?好吧,您实际上可能想要打开/dev/tty
;这在某种程度上取决于您实际在做什么。在那种情况下,答案是显而易见的。但是让我们假设你没有。因此,您想更改已打开文件的标志。这正是fcntl
是为了。您使用 F_GETFL
操作来读取当前标志,或者在 O_NONBLOCK
的位中,以及 F_SETFL
结果。当然,如果您想恢复内容,您可以记住当前标志以备后用。
在 Python 中,fcntl
函数和操作常量在 fcntl
中可用。模块。
最后一个问题:sys.stdin
不是原始文件对象,它是 TextIOWrapper
在 BufferedReader
之上进行 Unicode 解码,它本身在 FileIO
之上添加了缓冲.所以,sys.stdin.read()
并不是直接调用 POSIX read
函数。为此,您需要使用 sys.stdin.buffer.raw
。如果您想在原始输入和正常输入之间来回切换,您可能还需要进行大量仔细的冲洗。 (请注意,这意味着您要放弃 Unicode,取而代之的是获得单字节 bytes
对象,例如,它可能是 UTF-8 字符的一半或终端转义字符的四分之一。希望您对此有所期待。)
现在,当没有可用内容时,FileIO.read
返回什么?好吧,它是 RawIOBase
的实现,并且 RawIOBase.read
说:
If 0 bytes are returned, and size was not 0, this indicates end of file. If the object is in non-blocking mode and no bytes are available,
None
is returned.
换句话说,如果没有可用的,你将得到None
,对于EOF,你将得到b''
,或者一个单字节的bytes
用于其他任何内容。
所以,把它们放在一起:
old_settings = termios.tcgetattr(fd)
old_flags = fcntl.fcntl(fd, fcntl.F_GETFL)
try:
tty.setraw(fd)
fcntl.fcntl(fd, fcntl.F_SETFL, old_flags | os.O_NONBLOCK)
return sys.stdin.buffer.raw.read(1)
finally:
fcntl.fcntl(fd, fcntl.F_SETFL, old_flags)
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
最后一件事:有没有办法在不读取输入的情况下判断输入是否准备就绪?是的,但不是便携的。根据您的平台,select
、poll
、epoll
和/或 kqueue
可能可用并且可以在常规文件。 read(0)
可以保证返回 b''
而不是 None
。等等。您可以阅读本地手册页。但更简单的解决方案与 C 的 stdio 所做的相同:添加一个 1-byte-max 缓冲区,并使用它来实现您自己的 read
和 peek
或 read
和 unread
包装器。
关于python - 如何在不等待输入的情况下检查可能为空的标准输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26263636/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!