我可以用Python中的一个命令写入终端和给定的文件吗?

我可以用Python中的一个命令写入终端和给定的文件吗?,python,windows,python-2.6,python-idle,Python,Windows,Python 2.6,Python Idle,我看到这个问题在Bash中得到了回答,但在Python中找不到答案。如果这是重复的话,我会道歉 是否可以用一个命令打印到终端和输出文件?我熟悉使用print>和sys.stdout=writeableobject,但我希望避免为我想要记录的每一行重复打印命令 我使用的是Python2.6,以防需要这些知识 更重要的是,我希望它在基于Windows的系统上运行,使用IDLE的命令行。因此,本质上,我希望python脚本向IDLE的终端和给定的日志文件报告 编辑:对于任何发现这一点并决定使用我选择的

我看到这个问题在Bash中得到了回答,但在Python中找不到答案。如果这是重复的话,我会道歉

是否可以用一个命令打印到终端和输出文件?我熟悉使用
print>
sys.stdout=writeableobject
,但我希望避免为我想要记录的每一行重复打印命令

我使用的是Python2.6,以防需要这些知识

更重要的是,我希望它在基于Windows的系统上运行,使用IDLE的命令行。因此,本质上,我希望python脚本向IDLE的终端和给定的日志文件报告


编辑:对于任何发现这一点并决定使用我选择的答案的人,如果您需要了解上下文管理器的帮助(如我所做的),我推荐道格·赫尔曼(Doug Hellman)的本周Python模块进行澄清。如果您使用的是Unix,请获取有关装饰器的帮助:在程序开始时,您可以创建一个命名管道,并在bg中启动一个cat,从它到终端的T形三通以及所需的输出文件。然后在整个程序中,将命名管道的输出到fd。最后,在退出之前对命名管道进行rm


但老实说,我只是在打印文件周围做一个包装,打印到两个dest。

为什么不写一个函数呢

def myPrint(anOpenFileObject, message):
    print message
    anOpenFileObject.write(message)

更换
sys.stdout

class PrintAndLog(object):
    def __init__(self, fileOrPath): # choose which makes more sense
        self._file = ...

    def write(s):
        sys.stdout.write(s)
        self._file.write(s)

    def close(self):
        self._file.close()
    # insert wrappers for .flush, .writelines

_old_stdout = sys.stdout
sys.stdout = PrintAndLog(f)
... # print and stuff
sys.stdout = _old_stdout
可以放在上下文管理器中(这至少是我第三次单独看到这样的内容…):


不能解决你的问题吗?我不知道你说的“必须双重打印”是什么意思——请澄清。我假设f是可写对象?@Nathanus:编辑以澄清。如果你想保留对
print
的调用,这可能是正确的方法,不过,
self.\u file
可能是一个更好的名称,避免隐藏内置项。@Chinmay:对象的属性如何隐藏内置项?我仍将添加下划线,因为文件确实应该是私有的。@delnan我从未听说过上下文管理器。。。。我们将研究它,并使用这种方法。谢谢还有,既然你以前见过这个请求,你能找到一个前世的链接吗?如果我的搜索不够彻底,我想了解一下我错过了什么。这可以进一步概括为一个TeeStream,它接受两个可写对象,而不是将其限制在
stdout
。这是一个次要问题,但你最好将
sys.stdout=…
放在
try
内部而不是外部。这样,如果异步异常(如
KeyboardInterrupt
)在赋值之后但在输入异常处理程序之前发生,它仍然会正确地清除。
from contextlib import contextmanager

@contextmanager
def replace_stdout(f):
    old_stdout = sys.stdout
    try:
        sys.stdout = PrintAndLog(f)
        yield
    finally:
        sys.stdout = old_stdout