Закрытие файлов в Python - PullRequest
4 голосов
/ 04 марта 2011

В этом обсуждении о самом простом способе запуска процесса и отбрасывания его вывода я предложил следующий код:

with open('/dev/null', 'w') as dev_null:
    subprocess.call(['command'], stdout=dev_null, stderr=dev_null)

Другой разработчик предложил эту версию:

subprocess.call(['command'], stdout=open('/dev/null', 'w'), stderr=STDOUT)

Мой программист на C ++ хочет сказать, что когда объекты освобождаются, это деталь реализации, поэтому, чтобы не оставлять файловый дескриптор открытым в течение неопределенного периода времени, я должен использовать with.Но пара из ресурсов предполагает, что Python всегда или почти всегда использует подсчет ссылок для кода, подобного этому, и в этом случае дескриптор файла должен быть восстановлен, как только будет выполнено subprocess.call и использованиеwith не требуется.

(Я полагаю, что оставить дескриптор файла открытым для /dev/null, в частности, вряд ли имеет значение, поэтому представьте, что это важный файл.)

Какой подход лучше?

Ответы [ 3 ]

10 голосов
/ 04 марта 2011

Вы правы, возврат заказа не гарантирован . Фактически, только CPython (который является основной реализацией, да, но не единственно удаленной) обеспечивает пересчет. В случае, если CPython когда-либо изменит детали реализации (маловероятно, да, но возможно), или ваш код когда-либо будет запущен на альтернативной реализации, или вы потеряете возврат из-за какой-либо другой причины, файл не будет закрыт. Поэтому, учитывая, что оператор with делает очистку очень легкой, я бы предложил вам всегда использовать диспетчер контекста при открытии файлов.

1 голос
/ 04 марта 2011

Весь смысл оператора with заключается в контролируемом процессе очистки.Вы делаете это правильно, не позволяйте никому убедить вас в обратном.

1 голос
/ 04 марта 2011

Когда канал к нулевому устройству закрывается, это не имеет значения - это не приведет к потере данных на выходе или тому подобному.Хотя вы, возможно, захотите использовать вариант with всегда, чтобы гарантировать, что ваши выходные файлы всегда правильно очищаются и закрываются и т. Д., Это не пример, где это имеет значение.

...