#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.