LINUX.ORG.RU

Ответ на: комментарий от wakuwaku

я понимаю, за open должен идти close. Иначе после выхода из функции файл закроется. А как может закрыться dev/null? Да и в dev/null должен перенаправляться вывод. В примере сначала получаем дескриптор файла, копируем в него ввод и все - ничего не закрываем. (пример создания демона)

pisipu
() автор топика
Ответ на: комментарий от pisipu

А как может закрыться dev/null?

Так же, как и обычный файл.

$ lsof /dev/null | wc -l
39

Делай with open, файл закроется сам по выходу из блока.

entefeed ☆☆☆
()
Ответ на: комментарий от wakuwaku

ну да. Если использовать open, то после выхода с блока файл файл закроется. Функция, мне кажется, file не должна закрыть. Вообще какая разница между open и file?

Закрываю ввод и вывод, т.к пытаюсь написать демона.

pisipu
() автор топика
Ответ на: комментарий от pisipu

я понимаю, за open должен идти close.

После, а не за, и после file тоже - получаются совершенно одинаковые объекты. Лучше будет использовать os.open() который вернёт сырой fd.

Иначе после выхода из функции файл закроется.

Ты делаешь dup, значит файл останется открытым под другим дескриптором который сам по себе не закроется.

mashina ★★★★★
()
Ответ на: комментарий от mashina

ok. Какая тогда разница между file и open?

pisipu
() автор топика

странно, почему-то 2to3 ничего не сказал

f1u77y ★★★★
()
Ответ на: комментарий от pisipu

мне кажется, file не должна закрыть

На основании чего тебе так кажется?
В любом случае не выходе получается объект типа file. Как я понял open это обёртка над file.
Я эту тему особенно не копал, но могу предположить что файловый дескриптор автоматически закрывается только тогда когда исчезает последняя ссылка на него (например если он был создан внутри функции и находился в её скопе). Ну и возможно после некоторых других действий не предполагающих дальнейшего использования файла.
Если тебе надо использовать этот дескриптор за пределами функции, то положи его в глобальную переменную.

Про разницу между file и open вот что нагуглилось:
http://stackoverflow.com/questions/112970/python-when-to-use-file-vs-open

А вообще, кажется ты что-то странное делаешь, чего ты хочешь добиться в результате?

MrClon ★★★★★
()
Ответ на: комментарий от pisipu

после выхода с блока файл файл закроется

Нет, он закроется тогда когда до него доберётся garbage collector. Поэтому ф-я может тупо вернуть дескриптор и всё будет хокей.

true_admin ★★★★★
()
Ответ на: комментарий от MrClon

файловый дескриптор автоматически закрывается только тогда когда исчезает последняя ссылка на него

Файловый дескриптор сам закрывается только во время завершения выполнения программы, а file это не файловый декспритор.

mashina ★★★★★
()
Ответ на: комментарий от mashina

Я думал это питоновская обёртка для файлового дескриптора. И когда я в последний раз проверял (минуту назад) файловый дескриптор отрытый из функции закрывался по завершении работы функции.

def foo():
    f = open('/some/file')
    time.sleep(10)

Пока функция «работает» процесс держит открытый файловый дескриптор для /some/file, по завершении работы функции (но не процесса) дескриптор закрывается. Открытые дескрипторы смотрел по /proc/$pid/fd/

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

Я думал это питоновская обёртка для файлового дескриптора.

Нет, file это объект с каким-то там набрром интерфейсов который внутри использует fd. Отдельной обёртки для fd в питоне нет, есть обыкновенный fd в виде чиселкий с которой не происходит никакой специальной магии в gc.

mashina ★★★★★
()

Не понял что нужно, но более правильно будет использовать эту конструкцию:

with open (filename, mode) as f:

Файл закроется автоматически по окончании вычислений. В python2 оно так же будет работать.

ykroop
()
Ответ на: комментарий от MrClon

файловый дескриптор отрытый из функции закрывался по завершении работы функции.

Кстати, не советую на такое поведение ориентироваться. Оно закрывает, когда соберет сборщик мусора, а в разных реализациях это может в разный момент происходить. Поэтому надо with блоки использовать или явно close дергать, если важно, чтобы файл был закрыт.

pawnhearts ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.