将 python 脚本的输出重定向到文件

将 python 脚本的输出重定向到文件

如何获取此 python 脚本的输出以附加到日志文件

sudo inotifywait -mr --format '%e%w%f' --event move $srdir | python3 /usr/bin/m-sync.py $bkdir $srdir >> /mnt/msync.py.log2不起作用。没有错误消息,只是一个空的未修改的日志文件。

如果我这样做,sudo inotifywait -mr --format '%e%w%f' --event move $srdir | python3 /usr/bin/m-sync.py $bkdir $srdir输出就会按预期输出到控制台。

最终 sudo inotifywait -mr --format '%e%w%f' --event move $srdir | python3 /usr/bin/m-sync.py $bkdir $srdir >> /mnt/msync.py.log2是由 systemd 作为服务从脚本运行,但我认为这无关紧要,因为当我从命令行手动运行它时,它仍然不记录。

在所有情况下,脚本实际上都正确地完成了它的工作,我只是无法将其输出写入日志。

python 脚本只是为了以防万一:

#!/usr/bin/python3
import sys
import time
from subprocess import call
src = ""
bkdir = sys.argv[1]
srdir = sys.argv[2]
while True:
        line = sys.stdin.readline()
        event, path = line.split("/",1)
        path="/"+path.rstrip();
        if event in  ["MOVED_FROM","MOVED_FROM,ISDIR"]:
                src = path.replace(srdir, bkdir, 1)
        if event in ["MOVED_TO","MOVED_TO,ISDIR"]:
                dst  =  path.replace(srdir, bkdir, 1)                    
                sys.stdout.write(time.strftime("%Y-%m-%d %H:%M:%S") + " mv " + src + " " + dst )
                call(["mv", src, dst])

编辑:显然sudo inotifywait -mr --format '%e%w%f' --event move $srdir | sudo python3 /usr/bin/m-sync.py $bkdir $srdir >> /mnt/msync.py.log2从命令行运行确实有效。请注意调用 python 之前的第二个 sudo。然而,当由 systemd 运行时,默认情况下一切都是 root 并且仍然不输出到日志。

答案1

https://stackoverflow.com/a/3167526/7192818

我不知道这是否也适用于 python,但我认为这取决于您正在运行的操作系统。

例如,在 Linux 上,输出到终端会在换行符上刷新缓冲区,而对于输出到文件,它仅在缓冲区已满时刷新(默认情况下)。这是因为刷新缓冲区次数较少会更有效,并且用户不太可能注意到输出是否未在文件中的换行符上刷新。

如果您需要的话,您也许可以自动刷新输出。

因此,在 python 脚本中,sys.stdout.flush()在写入之后添加使其行为符合预期。

嗯。

相关内容