有一个第三方提供的脚本,一直在用,里面很多功能也封装的很好。唯一的缺憾就是他没有使用 log 模块,全部是 print 语句输出。
现在老板想把所有 print 的输出全部实时的保存到一个文本文件中,又不能影响现有的屏幕输出,感觉比较困难。
我试过用管道重定向:python cudaCFD.py > result.txt 发现只有在最后程序全部退出的时候才会把输出一次性写入到这个 result.txt 文件里面,而且这个方法也不能同时在屏幕的命令行中输出。
希望各位 python 大佬指导一下,谢谢。
1
Trim21 Sep 6, 2017
覆写一下 print 函数
|
2
0ZXYDDu796nVCFxq Sep 6, 2017 via iPhone tee 命令
|
3
a87150 Sep 6, 2017
def pl(x):
print(x) log(x) |
4
misaka19000 Sep 6, 2017 |
5
NoAnyLove Sep 6, 2017
#4 的 Monkey patch 很巧妙,赞一个
|
6
misaka19000 Sep 6, 2017 虽然 V 站的编辑器很烂,还是把代码放上来吧
```python import 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 Sep 6, 2017
with open('file', 'wa') as f:,这里不确定要不要覆盖原文件还是添加新的输出
print(result, file=f) print(result) Python2 的话,导入下__future__ |
10
mxi1 Sep 6, 2017
在代码里面,尽量用 Logger,少用 print。
|
11
PythonAnswer Sep 6, 2017
logging 是解决方案。
|
13
Osk Sep 6, 2017 |
14
gaayyy OP @misaka19000 再请教一下大佬,如果按照你这个 class,需要在最后调用一下 flush 函数么?是不是要 flush 一下才会写入到文件?
|
16
xiaozizayang Sep 7, 2017
print("hello", file= open("./1.txt", 'a'))
|
17
fluyy Sep 7, 2017 via iPhone
用 logger 啊,定义输出到文件和控制台,我就是这么搞得
|
19
gouchaoer Sep 7, 2017
都写了那么多 print 了,怎么改成 logger 啊
我给你推荐一门语言 javascript,那个函数随便你改 |
20
Osk Sep 7, 2017
回复用 管道+tee 的朋友来踩坑了。
楼主应该是被 python 的 stdout 缓冲坑了,直接 | tee 或者 > 重定向到文件 这样信息输出不是“实时”的,只有等 buffer 满了才会输出,中途 ctrl+c 中断了甚至会丢失一些输出。运行 python 时关闭缓冲就可以了,不需要改代码,毕竟一个个 print 去修改太麻烦,万一第三方模块中有黑魔法就坑大了。 |
21
gaayyy OP |
22
qq191513 Aug 13, 2018
拿走不用谢我~
def print_and_save_txt(str=None,filename=r'log.txt'): with open(filename, "a+") as log_writter: print(str) log_writter.write(str) |