我可以用Python中的一个命令写入终端和给定的文件吗?
我看到这个问题在Bash中得到了回答,但在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的终端和给定的日志文件报告 编辑:对于任何发现这一点并决定使用我选择的
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