Piszę skrypt kopii zapasowej, który zamierzam wykonywać w cronjobie każdej nocy.Przekierowanie pliku Ouput w języku Python
Skrypt ustawia sys.stdout i sys.stderr na plik wyjściowy, aby zachować rejestr zdarzeń.
Aby wykonać kopię zapasową I użyć następującego kodu
cmd = 'rsync -av --del --stats --filter "- .thumbnails/" ' + \
'--filter "- *~" --filter "- *.iso" --filter "- lost+found/" ' + \
'--filter "- .cache/" --filter "- tmp/" --filter "- *.mp3" ' + \
'--filter "- *.log" ' + srcDir + ' ' + dstDir
print "Executing '"+cmd+"' ..."
try:
sys.stdout.flush()
sys.stderr.flush()
retcode = subprocess.call(cmd, stdin = sys.stdin, stdout = sys.stdout,
stderr=sys.stderr, shell=False)
if retcode < 0:
print >>sys.stderr, "Command was terminated by signal", -retcode
elif retcode > 0:
print >>sys.stderr, "Command returned code ", retcode
except OSError, e:
print >>sys.stderr, "Execution failed:", e
dodaję wypowiedzi drukowania przed i po wywołaniu subprocess. Problem polega na tym, że przed wywołaniem otrzymuję dane wyjściowe wywołania podprocesu przed jakimkolwiek wyjściem z moich instrukcji drukowania. Dodałem wywołania flush(), ale nie ma ono żadnego efektu.
Dlaczego tak się dzieje i jak mogę zmienić to zachowanie?
W jaki sposób ustawiasz sys.stdout i sys.stderr? – Ned
Wydaje się poprawne i nie powinno się tak zachowywać (a nie kiedy próbuję), czy mógłbyś opisać swoje środowisko (system operacyjny, powłokę, z której uruchamiasz skrypt)? – RedGlyph
Dlaczego nie używasz istniejących narzędzi, takich jak 'rsnapshot' (używa również' rsync'). – jfs