将打印重定向到日志文件

51 投票
10 回答
144722 浏览
提问于 2025-04-15 20:50

好的,我完成了我的第一个Python程序,差不多有1000行代码。在开发过程中,我在使用os.system()运行命令之前,放了很多print语句,像这样:

print "running command",cmd
os.system(cmd)

现在我已经完成了这个程序。我考虑过把这些语句注释掉,但我觉得把这些不必要的打印信息(我不能删掉所有的print语句,因为有些是给用户提供有用信息的)重定向到一个日志文件里会更有用。有没有什么技巧或者建议呢?

10 个回答

12
  • 下次,如果你一开始就使用 logging 模块,而不是到处使用 print 语句,你会更开心。这个模块能给你想要的控制,而且你可以让它把信息写到标准输出(stdout),这样就能满足你的需求。

  • 这里很多人建议重定向标准输出。这个方法很糟糕。 它会改变一个全局变量,更糟的是,它只为这个模块改变。与其这样,我宁愿写个正则表达式,把所有的 print foo 改成 print >>my_file, foo,然后把 my_file 设置为标准输出或我选择的实际文件。

    • 如果你的应用程序中有其他部分真的依赖于写入标准输出(或者将来可能会依赖,但你现在还不知道),那么这样做会破坏它们。即使没有,这样也会让你的模块看起来像是做一件事,实际上却在做另一件事,如果你上面漏掉了一行代码。
    • 使用重定向的打印方式虽然不好看,但比临时改变 sys.stdout 要好得多。
    • 从技术上讲,正则替换并不能完全正确地做到这一点(例如,如果你在多行字符串中,它可能会产生错误的匹配)。不过,它可能会有效,只要留意一下就行。
  • os.system 几乎总是比使用 subprocess 模块要差。后者不需要调用 shell,不会以通常不希望的方式传递信号,而且可以以非阻塞的方式使用。

66

你可以看看这个Python的日志模块


补充说明:下面是一个示例代码:

import logging

if __name__ == "__main__":
    logging.basicConfig(level=logging.DEBUG, filename="logfile", filemode="a+",
                        format="%(asctime)-15s %(levelname)-8s %(message)s")
    logging.info("hello")

这个代码会生成一个名为“logfile”的文件,里面的内容是:

2012-10-18 06:40:03,582 INFO     hello
72

Python 允许你捕获并赋值给 sys.stdout,正如之前提到的,来实现这个功能:

import sys
old_stdout = sys.stdout

log_file = open("message.log","w")

sys.stdout = log_file

print "this will be written to message.log"

sys.stdout = old_stdout

log_file.close()

撰写回答