Перенаправление выходного файла в Python - PullRequest
6 голосов
/ 31 октября 2009

Я пишу сценарий резервного копирования, который я намерен выполнять в cronjob каждую ночь.

Сценарий устанавливает sys.stdout и sys.stderr в выходной файл, чтобы вести журнал того, что происходит.

Для резервного копирования я использую следующий код

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

Я добавляю операторы печати до и после вызова подпроцесса. Проблема в том, что я получаю вывод вызова подпроцесса перед любым выводом моих инструкций печати перед вызовом. Я добавил вызовы flush (), но это не имеет никакого эффекта.

Почему это происходит и как я могу изменить это поведение?

Ответы [ 3 ]

3 голосов
/ 31 октября 2009

Я только что нашел решение здесь в ответе Stackoverflow.

Заменить

sys.stderr = sys.stdout = logFile = open( tmpLogFileName, 'a' )

с

sys.stderr = sys.stdout = logFile = open( tmpLogFileName, 'a', 0 )

Это говорит Python не назначать выходной буфер для файла.

0 голосов
/ 31 октября 2009

Почему вы печатаете в stderr? Если подпроцесс записывает в stdout, когда вы пишете в stderr, это может объяснить странное чередование.

0 голосов
/ 31 октября 2009

Вы пробовали ставить сбрасывающие вызовы вне блока try?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...