我可以用一个命令同时写入终端和文件吗?
我看到这个问题在讨论Bash时有回答,但找不到关于Python的答案。如果这重复了什么,我先说声抱歉。
有没有办法用一个命令同时打印到终端和输出文件?我知道可以用 print >>
和 sys.stdout = WritableObject
,但我想避免对每一行都要重复打印命令。
我使用的是Python 2.6,顺便提一下,这个信息可能有用。
更重要的是,我希望这个能在Windows系统上运行,并使用IDLE的命令行。所以,简单来说,我想让这个Python脚本同时在IDLE的终端和一个指定的日志文件中输出信息。
编辑:如果有人看到这个并决定采用我选择的答案,如果你需要理解上下文管理器(就像我当初一样),我推荐Doug Hellman的《每周Python模块》来帮助理解。这篇详细介绍了上下文库。 如果需要了解装饰器,可以参考这个Stack Overflow问题的回答。
3 个回答
0
如果你在使用Unix系统:在你程序开始的时候,可以用mkfifo命令创建一个命名管道,然后在后台启动一个cat命令,把这个管道的内容同时输出到终端和你想要的文件里。接着,在你程序运行的过程中,向这个命名管道的文件描述符(fd)输出内容。最后,在程序退出之前,记得删除这个命名管道。
不过老实说,我建议你可以写一个包装函数,把内容同时输出到两个地方,这样更简单。
2
为什么不直接写一个函数呢?
def myPrint(anOpenFileObject, message):
print message
anOpenFileObject.write(message)
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
可以放入一个上下文管理器中(这至少是我在StackOverflow上看到的第三次类似的内容...):
from contextlib import contextmanager
@contextmanager
def replace_stdout(f):
old_stdout = sys.stdout
try:
sys.stdout = PrintAndLog(f)
yield
finally:
sys.stdout = old_stdout