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

时间:2011-03-14 18:31:12

标签: python windows python-2.6 python-idle

我已经看到这个问题在参考Bash时被回答了,但找不到Python的一个。如果这是重复的事情,请道歉。

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

我正在使用Python 2.6,以防这些知识是必要的。

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

编辑:对于任何发现这一点的人,并决定选择我选择的答案,如果你需要帮助理解上下文管理器(就像我做的那样),我推荐Doug Hellman的本周Python模块澄清。 This one details the context library.有关装饰器see this Stack Overflow question's answers.

的帮助

3 个答案:

答案 0 :(得分:6)

替换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

可以放入上下文管理器(这至少是我第三次在SO上看到类似的东西......):

from contextlib import contextmanager

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

答案 1 :(得分:2)

为什么不写一个函数?

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

答案 2 :(得分:0)

如果您使用的是Unix:在程序开始时,您可以mkfifo命名管道,然后在bg中将cat从它发送到终端的tee和所需的输出文件。然后在整个程序中,输出到命名管道的fd。最后,在退出之前使用命名管道。

但老实说,我只是制作一个印刷品包装纸,然后打印到两个纸板上。