问题背景:
在跑深度学习的情况下,需要在Linux终端下直接使用python命令来执行程序,但是我不仅想显示在屏幕上,还想把log文件保存到本地,来分析结果。这时候就需要用到Linux的管道命令和重定向命令tee来实现。
解决方案:
关于tee命令可以参考[1] [4],Python在终端的使用可以参考[2]。
python -u stout.py | tee -a logfile2
这行命令的意思是说Python执行标准输出流不仅输出到屏幕还经过重定向输入到logfile2这个文件中去。 一定要加上-u这个参数,在[2]文档有提到:
-u
Force the stdout and stderr streams to be unbuffered. This option has no effect on the stdin stream.
See also PYTHONUNBUFFERED.
Changed in version 3.7: The text layer of the stdout and stderr streams now is unbuffered.
附加技巧:
如果你不想在终端上输出,想让程序在后台执行,以防手残关掉终端(深度学习训练时千万别犯这种低级错误),可以使用:
nohup python -u train_all.py > train_all.log 2>&1 &
这行命令详解:
nohup 放在命令的开头,表示不挂起(no hang up),也即,关闭终端或者退出某个账号,进程也继续保持运行状态,一般配合&符号一起使用。如nohup command &
python -u train_all.py 表示Python执行时,加上-u(unbuffered)参数后会强制其标准输出也同标准错误一样不通过缓存直接打印到屏幕[2]
> train_all.log 表示将标准输出输出到train_all.log这个log文件中去
2>&1 也就表示将错误重定向到标准输出上
& 放在命令到结尾,表示后台运行,防止终端一直被某个进程占用,这样终端可以执行别到任务。
reference:
[1]https://linux.cn/article-9435-1.html
[2]https://docs.python.org/3/using/cmdline.html#envvar-PYTHONUNBUFFERED
[3]https://stackoverflow.com/questions/21662783/linux-tee-is-not-working-with-python