如何使用脚本将stdout重定向到文件和控制台?
问题的原因是想要在脚本中同时将输出重定向到文件和控制台,以便可以在调试时查看日志。解决方法是使用logging模块来实现这一目的。以下是实现的代码:
import logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', filename='logs_file', filemode='w') console = logging.StreamHandler() console.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') console.setFormatter(formatter) logging.getLogger('').addHandler(console) logging.info('Jackdaws love my big sphinx of quartz.') logging.info('Hello world')
以上代码首先通过调用`basicConfig`函数来设置日志级别、格式、文件名和文件模式,从而将日志记录到文件中。然后创建一个新的`StreamHandler`对象,设置日志级别并指定格式。接下来将格式应用到`StreamHandler`对象上,并将其添加到根日志记录器中。这样,日志信息就会同时输出到文件和控制台。
参考来源:[https://docs.python.org/2/howto/logging-cookbook.html](https://docs.python.org/2/howto/logging-cookbook.html)
如何在脚本中将stdout重定向到文件和控制台?
问题的原因是,有时候我们希望将Python脚本中的输出同时打印到控制台和文件中。解决方法有两个:
1. 使用shell重定向,在执行Python文件时使用以下命令:
python foo_bar.py > file
。这将把Python源代码中打印到stdout的所有结果写入文件中。
2. 如果你希望在脚本内部进行日志记录,可以使用以下代码:
import sys class Logger(object): def __init__(self): self.terminal = sys.stdout self.log = open("logfile.log", "a") def write(self, message): self.terminal.write(message) self.log.write(message) def flush(self): pass sys.stdout = Logger()
现在你可以使用
print "Hello"
语句,这将把"Hello"同时写入stdout和日志文件中。
某些情况下了不希望手动输入> file
命令的问题。对此有两个建议:可以使用命令行或者在代码中使用上述Logger类。这个类会将输出发送到控制台和文件中,无需在命令行中指定任何特殊参数。
还有人问如何恢复到正常的sys.stdout
行为。可以在Logger中保存先前的sys.stdout
,并创建一个函数将其恢复到原始状态。
还某些情况下了如何同时将stdout和stderr写入两个不同的文件。可以在sys.stdout = Logger()
之后添加sys.stderr = sys.stdout
来实现Python错误日志记录。
最后有人问如何将一个Python脚本中的print语句输出到日志文件中。可以在脚本中使用os.system("python test.py")
命令,然后将test.py中的print语句输出到logfile.log文件中。
问题出现的原因是无法将输出同时重定向到文件和控制台,解决方法是创建一个Unbuffered类,将stdout的输出同时写入文件和控制台,并在文件末尾添加te.flush()来强制刷新缓冲区并写入数据,同时添加te.close()来关闭文件,以防止应用程序无法删除数据。另外,在Jupyter中,为了解决单元格无限运行的问题,需要在脚本末尾将sys.stdout重新赋值为原始的stdout。
以下是解决问题的代码:
te = open('log.txt','w') # File where you need to keep the logs class Unbuffered: def __init__(self, stream): self.stream = stream def write(self, data): self.stream.write(data) self.stream.flush() te.write(data) # Write the data of stdout here to a text file as well sys.stdout=Unbuffered(sys.stdout) # 在文件末尾添加以下代码 te.flush() te.close() sys.stdout = orig_stdout
关于te.flush()的工作原理,它会在缓冲区满或者程序结束时将数据刷新到文件中,具体取决于缓冲区的大小。更多关于缓冲区刷新的信息可以参考这里:stackoverflow.com/questions/3167494/...