我已经看到这个问题在参考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.
的帮助答案 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。最后,在退出之前使用命名管道。
但老实说,我只是制作一个印刷品包装纸,然后打印到两个纸板上。