python - 同时显示实时数据和命令行输入
问题描述
我正在尝试编写一个显示实时数据并同时允许命令输入的 CLI 应用程序。它应该看起来像这样:
Real-time data 1: XXXX Converted Value: XX.X%
Real-time data 2: XXXX Converted Value: XX.X%
Real-time data 3: XXXX Converted Value: XX.X%
...
Input Cmd Here $:
其中“X”在某个时间段更新并且该Input Cmd Here $:
行保持在原位并且用户可以输入命令。我还想打印一次命令执行状态。
我正在使用 cmd 模块和 argparse 收集用户输入,并在不同的线程中打印数据。
import threading, cmd, time, serial
class CLI(cmd.Cmd):
def __init__(self):
super().__init__()
self.cmd_parser = argparse.ArgumentParser()
self.subparser = self.cmd_parser.add_subparsers(dest='command')
self.read = self.subparser.add_parser('R')
self.read.add_argument("-i", type=int, nargs=3, required=True)
self.read.set_defaults(func=self._send_read_cmd)
def default(self, line: str) -> bool:
""" Command parser + handler """
try:
args = self.cmd_parser.parse_args(line.split())
except SystemExit:
return False
if hasattr(args, 'func'):
args.func(args)
def _send_read_cmd(args):
""" Send read command """
...
return 0
class Display:
def __init__(self):
self.ser = serial.Serial(...)
def get_data(self):
# Get serial data
data = self.ser.read(100)
#format data dict
...
return data_dict
def _display_thread(self):
print('Entering display handling thread.')
while True:
real_time_data = self.get_data()
print(...) # Print display lines with real-time data here
time.sleep(1)
def run(self):
""" Spawns the command handling thread """
self._display_thread = threading.Thread(target=self._display_thread)
self._display_thread.start()
# Wait for thread to end
self._display_thread.join()
return 0
if __name__ == '__main__':
display = Display()
display.run()
cli_app = CLI()
return cli_app.cmdloop()
这有一些明显的问题。首先,显示线程在命令提示符处打印一个新行,而不是仅仅覆盖当前显示。我已经搜索了一段时间,找不到一种方法来做我想做的事。任何指针将不胜感激。第二个是cmd提示永远不会出现。出于某种原因,CLI 线程似乎在显示线程退出之前不会运行。问题可能是什么?我很感激任何帮助。
解决方案
推荐阅读
- reactjs - 在渲染反应之前设置状态
- vba - VBA - 查找 lastColumn 并检查第一行是否为空
- arrays - Kotlin 中的数组声明
- node.js - AG Grid 可以在 NodeJS 上运行吗?
- javafx - 响应式 JavaFX BorderPane
- python - Python LDAP 搜索不返回 ActiveDirectory 属性
- java - java中活动线程数中的后台线程是什么?
- firebase - 在 beta 0.3.2 上使用 Firebase-auth 插件的 Flutter 的 Xcode 构建错误:不兼容的块指针
- r - 当我安装我的 R 包(用于测试)时,它还会重新安装系统上已经存在的所有依赖项(第一次)
- amazon-web-services - 如何在最近的位置/端点上复制现有的 aws-ec2 实例和 s3 数据以提高网络吞吐量?