![将 python 脚本的输出重定向到文件](https://linux22.com/image/99161/%E5%B0%86%20python%20%E8%84%9A%E6%9C%AC%E7%9A%84%E8%BE%93%E5%87%BA%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E6%96%87%E4%BB%B6.png)
如何获取此 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()
在写入之后添加使其行为符合预期。
嗯。