Python Windows7: странное поведение при открытии файла для добавления

#windows-7 #file-io #subprocess #python

#windows-7 #file-io #подпроцесс #питон

Вопрос:

Я вижу странное поведение, когда открываю файл в режиме добавления (‘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.
После того, как файл был открыт в первый раз, выполнение нескольких вызовов подпроцесса будет правильно добавлено к файлу, однако после закрытия и повторного открытия файла он больше никогда не будет добавлен.

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

Спасибо


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

 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 вот что я вижу:

тест
— Это ЕЩЕ ОДИН Гребаный ТЕСТ


Комментарии:

1. Я обновил свой ответ ниже, чтобы отразить новую информацию, которую вы опубликовали, за вычетом ругани 🙂

Ответ №1:

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

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

Таким образом, похоже, что «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)
 

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

Комментарии:

1. На самом деле это не дает ответа на вопрос, так как очевидно, что ему нужно использовать subprocess

2. Очевидно, но это помогло бы сузить проблему до вызова подпроцесса или вызовов open / write / close.

3. … что лучше всего указать в комментарии, поскольку это не решает вопрос и, следовательно, не является ответом, IMO.

4. таким образом, исключение подпроцесса из уравнения не приводит к той же проблеме.

5. Я добавил редактирование к своему первоначальному вопросу, чтобы показать еще более простую версию того, как он выходит из строя.

Ответ №2:

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

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