目前,我有一个应用程序,它使用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)