gpt4 book ai didi

python - 如何在 Python 中从 stdin 读取单个字符

转载 作者:行者123 更新时间:2023-12-02 03:35:53 24 4
gpt4 key购买 nike

关于如何阅读 stdin 有很多很棒的答案在 python 中,但我找不到任何有关读取单个字符而不是整行的信息。让我解释一下:

我需要读取arduino在串行端口上发送的信息,该信息被转发到标准输入。该信息经过处理并存储在文本文件中。我在arduino上编写了程序,这样我就可以改变信息的发送方式。计划是发送带有开始字符 ( < ) 和结束字符 ( > ) 的信息,因此它看起来像这样: <height:2342>

还会写入很多不相关的数据,这就是为什么我决定使用上面的形式,这样python脚本就可以检测到相关信息并捕获它。

我的 python 脚本将单独检查每个字符的起始字符 < ,理想情况下是输入的,然后捕获信息,直到 >已收到。我尝试使用 inputchar = sys.stdin.read(1) 获取输入。但这里的问题是,它是从 stdin 读取的。永远,直到捕获换行符( \n ),然后返回输入的第一个字符。

我希望此函数在发送到 stdin 后立即返回输入的字符。 ,而不是等待换行符。我该如何实现这一目标?

平台:Raspberry Pi Zero W、Raspbian Jessy、Python 2.7


我知道我可以使用 inputline = sys.stdin.readline() 并更改 Arduino 程序以在信息后发送换行符。然后分析整行(可能很长)并提取信息。但我认为这不是一个干净的方法。


串行端口更新:遗憾的是,我无法直接从 python 访问串行端口,因为还有第二个 python 脚本必须写入串行端口。由于只有一个可以访问该端口,解决方案是将串口重定向到 stdinstdout 。查看我的问题Access one Serial Port with two Python Scripts

最佳答案

这是因为你的terminal is in cooked mode 。您可以使用例如tty.setcbreakcurses.cbreak禁用行缓冲。这是 Unix 的事情,不是 Python 特有的。

示例:

import sys, tty
tty.setcbreak(sys.stdin.fileno())

请注意,这还有其他影响,例如禁用回显,并且在程序退出时会持续存在。通常,诸如curses上下文管理器之类的更高级别的接口(interface)用于处理键解析(例如箭头键,发送转义序列)和清理。

Python 之外的主要命令行工具是 stty

关于python - 如何在 Python 中从 stdin 读取单个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50239507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com