我正在使用Popen调用一个shell脚本,该脚本不断将其stdout和stderr写入日志文件 . 有没有办法连续同时输出日志文件(到屏幕),或者让shell脚本同时写入日志文件和标准输出?
我基本上想在Python中做这样的事情:
cat file 2>&1 | tee -a logfile #"cat file" will be replaced with some script
再次,这将stderr / stdout连接到tee,将它写入stdout和我的日志文件 .
我知道如何在Python中将stdout和stderr写入日志文件 . 我被困在哪里是如何将这些复制回屏幕:
subprocess.Popen("cat file", shell=True, stdout=logfile, stderr=logfile)
当然我可以做这样的事情,但有没有办法在没有tee和shell文件描述符重定向的情况下做到这一点?:
subprocess.Popen("cat file 2>&1 | tee -a logfile", shell=True)
3 回答
您可以使用管道从程序的标准输出读取数据并将其写入您想要的所有位置:
UPDATE
在python 3中,
universal_newlines
参数控制管道的使用方式 . 如果False
,管道读取返回bytes
对象并且可能需要被解码(例如,line.decode('utf-8')
)以获得字符串 . 如果True
,python会为你解码要模拟:
subprocess.call("command 2>&1 | tee -a logfile", shell=True)
而不调用tee
命令:要修复可能的缓冲问题(如果输出延迟),请参阅Python: read streaming input from subprocess.communicate()中的链接 .
这是Python 3版本:
Write to terminal byte by byte for interactive applications
此方法立即将其获取的任何字节写入stdout,这更接近地模拟了
tee
的行为,尤其是对于交互式应用程序 .main.py
sleep.py
首先,我们可以进行非交互式健全性检查:
而且我们认为这是实时的stdout .
接下来,对于交互式测试,您可以运行:
然后,您键入的字符会在您键入时立即显示在终端上,这对于交互式应用程序非常重要 . 运行时会发生这种情况:
此外,如果您希望输出立即显示在ouptut文件上,那么您还可以添加:
但
tee
不会这样做,我担心这会扼杀性能 . 您可以使用以下方法轻松测试:相关问题:live output from subprocess command
在Ubuntu 18.04,Python 3.6.7上测试 .