Python 3 等同于 Bash 的 "read -rs -t1 -n1" 命令到 poll/wait 的用户字符?
Python 3 equivalent to Bash's "read -rs -t1 -n1" command to poll/wait for a character from the user?
我有硬件 evaluation/test 的脚本已经过时 Bash 并且正在移动到 Python 3. 一切都非常顺利,除了一个绊脚石:我有难以找到 Python 替代 Bash 的 read -rs -t1 -n1
命令,该命令在返回前等待输入字符最多一秒钟,我用它来执行后台硬件安全检查(例如, "is it on fire yet?") 并在等待用户输入时显示微调器。
但是,我找不到 "pythonic" 替代品。目前找到的最接近的是Rosetta Code and here on StackExchange,都显得太低级了
缺少的关键要素似乎是 Python 在 Bash 的 [=15] 级别上缺少从标准输入进行非阻塞读取的高级功能=]命令。
需要跨平台 (Win/Mac/Lin) 功能,但 GNU/POSIX/Linux-only 目前就可以了。
在 Python 3 下是否有标准的高级方法来执行此操作?
在尝试了问题中提到的几个包之后(例如stdin
package),我终于决定回到我开始的地方:
def bash_read(optstr="-rs -t1 -n1"):
child = subprocess.Popen(["bash", "-c", "if read {}; then echo -n \"$REPLY\"; fi".format(optstr)], stdout=subprocess.PIPE)
reply = child.communicate()[0] # stdout content
return reply
optstr
参数默认为我最常用的 Bash read
选项,但是可以根据需要替换其他选项。
上述功能简化了将我的脚本移动到 Python 的过程。但它真的是 Pythonic 吗?嗯,是!在使用正确的工具完成工作的意义上。
一旦 3.7 进入发行版,上面的内容就变得更简单了,只需要一次调用 subprocess.run()
就可以从命令的标准输出和标准错误中获取 return 代码和文本。
我有硬件 evaluation/test 的脚本已经过时 Bash 并且正在移动到 Python 3. 一切都非常顺利,除了一个绊脚石:我有难以找到 Python 替代 Bash 的 read -rs -t1 -n1
命令,该命令在返回前等待输入字符最多一秒钟,我用它来执行后台硬件安全检查(例如, "is it on fire yet?") 并在等待用户输入时显示微调器。
但是,我找不到 "pythonic" 替代品。目前找到的最接近的是Rosetta Code and here on StackExchange,都显得太低级了
缺少的关键要素似乎是 Python 在 Bash 的 [=15] 级别上缺少从标准输入进行非阻塞读取的高级功能=]命令。
需要跨平台 (Win/Mac/Lin) 功能,但 GNU/POSIX/Linux-only 目前就可以了。
在 Python 3 下是否有标准的高级方法来执行此操作?
在尝试了问题中提到的几个包之后(例如stdin
package),我终于决定回到我开始的地方:
def bash_read(optstr="-rs -t1 -n1"):
child = subprocess.Popen(["bash", "-c", "if read {}; then echo -n \"$REPLY\"; fi".format(optstr)], stdout=subprocess.PIPE)
reply = child.communicate()[0] # stdout content
return reply
optstr
参数默认为我最常用的 Bash read
选项,但是可以根据需要替换其他选项。
上述功能简化了将我的脚本移动到 Python 的过程。但它真的是 Pythonic 吗?嗯,是!在使用正确的工具完成工作的意义上。
一旦 3.7 进入发行版,上面的内容就变得更简单了,只需要一次调用 subprocess.run()
就可以从命令的标准输出和标准错误中获取 return 代码和文本。