
有一个第三方提供的脚本,一直在用,里面很多功能也封装的很好。唯一的缺憾就是他没有使用 log 模块,全部是 print 语句输出。
现在老板想把所有 print 的输出全部实时的保存到一个文本文件中,又不能影响现有的屏幕输出,感觉比较困难。
我试过用管道重定向:python cudaCFD.py > result.txt 发现只有在最后程序全部退出的时候才会把输出一次性写入到这个 result.txt 文件里面,而且这个方法也不能同时在屏幕的命令行中输出。
希望各位 python 大佬指导一下,谢谢。
1 Trim21 2017-09-06 22:40:52 +08:00 覆写一下 print 函数 |
2 0ZXYDDu796nVCFxq 2017-09-06 22:44:00 +08:00 via iPhone tee 命令 |
3 a87150 2017-09-06 22:47:21 +08:00 def pl(x): print(x) log(x) |
4 misaka19000 2017-09-06 22:48:25 +08:00 |
5 NoAnyLove 2017-09-06 22:51:32 +08:00 #4 的 Monkey patch 很巧妙,赞一个 |
6 misaka19000 2017-09-06 22:51:59 +08:00 虽然 V 站的编辑器很烂,还是把代码放上来吧 ```python iport sys class Logger(object): def __init__(self, filename="Default.log"): self.terminal = sys.stdout self.log = open(filename, "a") def write(self, message): self.terminal.write(message) self.log.write(message) def flush(self): pass sys.stdout = Logger("yourlogfilename.txt") print("Hello world !") # this is should be saved in yourlogfilename.txt ``` |
7 gaayyy OP @Trim21 @a87150 不太希望动这个 print 函数,有的 print 的参数还不太一样,萌新不敢随便操作。 @gstqc 目测这个能解决问题,谢谢大佬 最后纠正一点,那个 python cudaCFD.py > result.txt 不是最后一次性输出的,而是每满 4k 字节就写一次文件,我第一次操作输出不满 4k 所以得到的是个空的文件。 |
8 gaayyy OP @misaka19000 大佬的实现方法目测很优雅,however,大佬的英语比较渣,this should be saved in xxx, 你写多了一个 is |
9 flaneurse 2017-09-06 22:55:08 +08:00 with open('file', 'wa') as f:,这里不确定要不要覆盖原文件还是添加新的输出 print(result, file=f) print(result) Python2 的话,导入下__future__ |
10 mxi1 2017-09-06 22:57:46 +08:00 在代码里面,尽量用 Logger,少用 print。 |
11 PythonAnswer 2017-09-06 23:00:56 +08:00 logging 是解决方案。 |
12 gaayyy OP @mxi1 第三方提供的,科学计算用的,写的人不是专业的程序员,但是确实是需要这个东西来算,算法什么的都在里面,一堆矩阵运算全部在里面,不敢动。。。 |
13 Osk 2017-09-06 23:03:02 +08:00 |
14 gaayyy OP @misaka19000 再请教一下大佬,如果按照你这个 class,需要在最后调用一下 flush 函数么?是不是要 flush 一下才会写入到文件? |
16 xiaozizayang 2017-09-07 09:07:06 +08:00 print("hello", file= open("./1.txt", 'a')) |
17 fluyy 2017-09-07 13:54:15 +08:00 via iPhone 用 logger 啊,定义输出到文件和控制台,我就是这么搞得 |
19 gouchaoer 2017-09-07 17:38:57 +08:00 都写了那么多 print 了,怎么改成 logger 啊 我给你推荐一门语言 Javascript,那个函数随便你改 |
20 Osk 2017-09-07 23:10:32 +08:00 回复用 管道+tee 的朋友来踩坑了。 楼主应该是被 python 的 stdout 缓冲坑了,直接 | tee 或者 > 重定向到文件 这样信息输出不是“实时”的,只有等 buffer 满了才会输出,中途 ctrl+c 中断了甚至会丢失一些输出。运行 python 时关闭缓冲就可以了,不需要改代码,毕竟一个个 print 去修改太麻烦,万一第三方模块中有黑魔法就坑大了。 |
21 gaayyy OP |
22 qq191513 2018-08-13 22:43:59 +08:00 拿走不用谢我~ def print_and_save_txt(str=None,filename=r'log.txt'): with open(filename, "a+") as log_writter: print(str) log_writter.write(str) |