首页 > 解决方案 > 同时显示实时数据和命令行输入

问题描述

我正在尝试编写一个显示实时数据并同时允许命令输入的 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 线程似乎在显示线程退出之前不会运行。问题可能是什么?我很感激任何帮助。

标签: pythonmultithreadingcommand-line-interface

解决方案


推荐阅读