不需要下载额外的包,就可实现文本和控制台同时打印
文章目录
- 不需要下载额外的包,就可实现文本和控制台同时打印
- 1. 我的环境
- 2. 使用重映射方法将输出保存到文件
- 3. 实现文本和控制台同时打印
1. 我的环境
- python 3.10
2. 使用重映射方法将输出保存到文件
有的时候,我们在命令行运行的时候,经常有需要将打印输出到log文件的需求,若只是想要保存输出到文件,最简单的就是在命令行中使用重映射:
在windows或linux命令行中运行python时将print输出保存到文件中,命令:
python -u run1.py > log.txt
当有参数的时候,正常输入参数即可:
python -u run2.py COM13 > log.txt
当程序运行失败也会打印,但是这个时候不是print打印,因此上面命令不能保存程序运行错误的打印信息,若需要将失败的信息也打印到文件中,则需要:
python -u run1.py > log.txt 2>&1
注意:命令的最后再加上2>&1,代表将标准错误也输出到标准输出当中.
上面命令的>
符号代表运行时如果文件已存在会清空已存在的文件的内容并从头开始写入。如果需要追加写入,就需要两个>符号,这样就不会清空已存在的文件中的内容,只会每次都在文件的最后追加写入,如下:
python -u run1.py >> log.txt 2>&1
在windows使用终端PowerShell可以通过命令cat
来查看文件的内容:
cat .\log.txt
打印出log.txt文件的内容,方便查看。
python命令加上-u(unbuffered)参数后会强制其标准输出也同标准错误一样不通过缓存直接打印到屏幕。
3. 实现文本和控制台同时打印
上面重映射的方法只能选择一个输出IO,不能控制台和文本一起打印,下面我们介绍一种不需要安装其它包,就可以实现文本和控制台同时打印的方法。
本文只介绍一种最简单的方案;动态的创建log文件,并将程序的每次执行的print打印到同一个log文件中。
结合这种思想,可以设计自己的打印方式;
首先先建一个py文件,比如先建立一个test_base.py,里面内容写:
# 从映射print输出到控制台同时输出到文件
import os
import time
filename = None # 保证单次执行程序,始终打印到同一个文件中
rewrite_print = print
output_dir = "log_file"
def get_time_file():
global filename
if filename == None: # 这个程序运行第一次打印,要创建文件
# 程序首次运行,创建一个log_file文件夹
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 以时间为文件名,生成log文件
t1 = time.time()
t_str = str(int(t1))
log_name = t_str + '.txt' # 日志文件名称
rewrite_print("new log file name: " + log_name)
filename = os.path.join(output_dir, log_name)
return fillogename
else: # 这个程序不是第一次打印,使用上次的文件
return filename
def print(*arg):
f_n = get_time_file() # 获取log的文件名,若没有就新建文件,并将文件名返回
rewrite_print(*arg) # 打印到控制台
with open(f_n, "a", encoding='utf-8') as f:
rewrite_print(*arg, file = f) # 写入文件
然后在同目录下创建一个test.py文件,内容为:
from test_base import print
if __name__ == '__main__':
print("log out test")
print("日志输出测试")
在控制台执行python test.py
即会在目录下生成一个log_file目录,并在目录下生成一个以时间命名的time.txt文件,里面保存的内容和控制台打印的内容一致。
每次执行python test.py
,都会生成一个txt文件。
这个文件的缺点是每次print都需要open一次log文件,因此效率不高。
有的时候,我们需要把程序运行的异常也需要保存下来,可以通过try的方式:
from test_base import print
import traceback
try:
demo.test()
except:
print("error")
traceback.print_exc()
continue