小编Jon*_*ers的帖子

更换sys.stdout时,cmd.Cmd中的Python readline选项卡完成

目前,我有一个应用程序,它使用cmd.Cmd模块作为命令行界面,tab-completion完美地工作.

现在,我想sys.stdout用另一个对象替换(例如,为了捕获正在写的内容.)

在理论上,以下片段应该是完全透明的,因为对Std对象的每个get/set操作都被重定向到actial sys.__stdout__.

class Std(object):
    def __getattribute__(self, name):
        if name in ('__getattribute__', '__setattr__'):
            return object.__getattribute__(self, name)
        else:
            return getattr(sys.__stdout__, name)

    def __setattr__(self, name, value):
        setattr(sys.__stdout__, name, value)

sys.stdout = Std()
Run Code Online (Sandbox Code Playgroud)

例如,sys.stdout.fileno()仍将打印1.但是,readline标签完成Cmd.cmd现在不再有效...

好的,让我们继承文件.(stdout是一个文件对象.)

class Std(file):
    def __init__(self):
        pass
    def __getattribute__(self, name):
        if name in ('__getattribute__', '__setattr__'):
            return object.__getattribute__(self, name)
        else:
            return getattr(sys.__stdout__, name)

    def __setattr__(self, name, value):
        setattr(sys.__stdout__, name, value)

sys.stdout = Std()
Run Code Online (Sandbox Code Playgroud)

现在我得到:

Traceback (most recent call last):
  File "./shell.py", line 61, …
Run Code Online (Sandbox Code Playgroud)

python readline

5
推荐指数
1
解决办法
1779
查看次数

标签 统计

python ×1

readline ×1