在带有 cmd 模块的 python 程序中用自定义 Logger 类对象覆盖 sys.stdout 时,Tab 键自动完成命令不起作用

问题描述 投票:0回答:0

我想将命令及其输出存储在 log.txt 中。因此,我将客户 Logger 类对象分配给 sys.stdout,并覆盖写入方法以将输出存储在文件中以及在控制台中打印。这里的问题是,当 sys.stdout 被覆盖时,ABC 类 (hi,hello,shutdown) 中命令的“tab”自动完成不起作用,向上和向下箭头也不适用于向前和向后的历史命令。

import cmd
import sys
import readline
LOG_FILE=open("log.txt",'w+')
class Logger():
    def __init__(self):
        self.console=sys.stdout
    def write(self,message):
        self.console.write(message)
        LOG_FILE.write(message)
    def flush(self):
        self.console.flush()

class ABC(cmd.Cmd):
    def __init__(self):
        sys.stdout = Logger()
        readline.set_completer(self.complete)
        readline.parse_and_bind("tab: complete")
    def do_hello(self,args):
        print("hello entered")
    def do_hi(self,args):
        print("Hi entered")
    def do_shutdown(self,args):
        print("shutting down")
        global LOG_FILE
        LOG_FILE.close()
    #sys.exit()
    def emptyline(self):
        pass
    def precmd(self,args):
        LOG_FILE.write(args+"\n")

if __name__ == '__main__':
    ABC().cmdloop()

cmd line image

我希望当在上面的命令中输入“hel”然后按下 Tab 键时,它应该在下一行显示“hello help”。按 tab 键不应向正在键入的命令添加 4 个空格。 请帮助工作解决方案,其中使用制表符、向上/向下箭头自动完成命令,命令及其输出应存储在文件“log.txt”中。 请注意,我在红色运行这个程序有 linux 7 操作系统,而不是 windows。

python sys python-cmd
© www.soinside.com 2019 - 2024. All rights reserved.