2

我已经看到这个问题在参考 Bash 时得到了回答,但找不到适用于 Python 的问题。抱歉,如果这是重复的话。

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

我正在使用 Python 2.6,以防万一需要这些知识。

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

编辑:对于任何发现此问题并决定采用我选择的答案的人,如果您需要帮助理解上下文管理器(就像我所做的那样),我推荐 Doug Hellman 的本周 Python 模块进行澄清。这一个详细说明了上下文库。有关装饰器的帮助,请参阅此 Stack Overflow 问题的答案。

4

3 回答 3

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
于 2011-03-14T18:38:37.143 回答
2

为什么不直接写一个函数?

def myPrint(anOpenFileObject, message):
    print message
    anOpenFileObject.write(message)
于 2011-03-14T18:38:13.560 回答
0

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

但老实说,我只会在 print 周围做一个包装,打印到两个目的地。

于 2011-03-14T18:34:27.030 回答