Python Windows7: странное поведение открытия файла для добавления - PullRequest
2 голосов
/ 25 октября 2011

Я вижу странное поведение, когда открываю файл в режиме добавления ('a +') под Windows 7 с помощью Python.

Мне было интересно, является ли поведение на самом деле некорректным или я неправильно понимаю, как его использоватьследующий код:

log_file= open(log_file_path, "a+")
return_code = subprocess.call(["make", target], stdout=log_file, stderr=subprocess.STDOUT)
log_file.close()

Приведенные выше строки кода неправильно добавляются в файл.На самом деле при последующих запусках он даже не изменяет файл.Я также проверил это с помощью Python Shell.Как только файл был открыт в первый раз, выполнение нескольких вызовов подпроцесса будет правильно добавлено к файлу, однако, как только файл будет закрыт и открыт, он никогда не добавится снова.

У кого-нибудь есть какие-либо подсказки?

Спасибо


Чтобы еще больше просто решить проблему Вот еще один набор шагов, которые не будут выполнены:

log_file=open("temp.txt", "a+")
log_file.write("THIS IS A TEST")
log_file.close()
log_file=open("temp.txt", "a+")
subprocess.call(["echo", "test"], stdout=log_file, stderr=subprocess.STDOUT, shell=True)
log_file.close()

Если вы откроете файл temp.txt, вот что ясм .:

тест
SA MUTHER F ** ТЕСТ

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

см. http://mail.python.org/pipermail/python-list/2009-October/1221841.html

кратко: открытие файла в режиме добавления оставляет файл ptr в состоянии, зависящем от реализации.стремиться к концу, чтобы получить те же результаты на Windows, как на Linux.

1 голос
/ 25 октября 2011

Похоже, ваша проблема в использовании shell = True. Из документации Python для POpen :

В Unix с shell = True: если args является строкой, она указывает Командная строка для выполнения через оболочку. Это означает, что строка должна быть отформатирована точно так же, как при вводе на оболочка подсказка. Это включает, например, цитирование или обратную косую черту экранирование имен файлов с пробелами в них. Если args - последовательность, Первый элемент указывает командную строку, а любые дополнительные элементы будут трактоваться как дополнительные аргументы к самой оболочке.

Похоже, что "echo" - это команда, а "test" отправляется в качестве аргумента в оболочку, а не "echo".

Итак, изменив ваш вызов подпроцесса на:

subprocess.call("echo test", stdout=log_file, stderr=subprocess.STDOUT, shell=True)

или

subprocess.call(["echo", "test"], stdout=log_file, stderr=subprocess.STDOUT)

Исправляет проблему, по крайней мере, в моем тестировании.

...