Пример использования низкоуровневых os.open, os.fdopen и др.?

В Python 3.2 (и других версиях) документация для os.open указывает:

Эта функция предназначена для низкоуровневого ввода-вывода. Для обычного использования используйте встроенную функцию open(), которая возвращает файловый объект с помощью методов read() и write() (и многих других). Чтобы обернуть файловый дескриптор в файловый объект, используйте fdopen().

И для fdopen():

Возвращает открытый файловый объект, связанный с файловым дескриптором fd. Это псевдоним open() и принимает те же аргументы. Единственное отличие состоит в том, что первый аргумент fdopen() всегда должен быть целым числом.

Этот комментарий на вопрос о разнице между io.open и os.open (эта разница мне совершенно ясна, я всегда использую io.open, никогда os.open) спрашивает: почему кто-то выбирает Python для низкоуровневого I/ О?, но на самом деле не получает ответа.

Мой вопрос очень похож на вопрос-комментарий: Какой вариант использования низкоуровневого ввода-вывода через os.open, os.fdopen, os.close, os.read и т. д. в Python? Раньше я так думал был необходим для деамонизации процесса, но я больше не уверен . Есть ли задача, которую можно выполнить только с помощью низкоуровневого ввода-вывода, а не с помощью оболочек более высокого уровня?


person gerrit    schedule 11.01.2013    source источник
comment
Я предполагаю, что обертки более высокого уровня используют эти функции. По крайней мере, модуль tempfile использует большинство из них на python 2.7.3...   -  person mgilson    schedule 11.01.2013
comment
@mgilson Тогда мой вопрос: почему временные файлы не могут использовать файлы более высокого уровня?   -  person gerrit    schedule 11.01.2013


Ответы (2)


Основные отличия:

  • Низкоуровневый доступ к файлам не буферизуется
  • Низкоуровневый доступ не является переносимым
  • Низкий уровень обеспечивает более точное управление, т.е. блокировать или не блокировать при чтении

Примеры использования низкоуровневого ввода-вывода:

  • Файл является блочным устройством
  • Файл является сокетом
  • Файл tty
  • ...

Во всех этих случаях вы можете захотеть иметь более тонкий контроль (поведение буферизации и блокировки).

Вероятно, вам никогда не понадобятся низкоуровневые функции для обычных файлов. Я думаю, что в большинстве случаев вариант использования будет связан с драйверами устройств. Однако это лучше сделать на C. Но я также вижу вариант использования для python, например. для быстрого прототипирования драйверов устройств.

person ilmiacs    schedule 11.01.2013

Я использую его, когда мне нужно использовать O_CREAT | O_EXCL для атомарного создания файла, сбой, если файл существует. Вы не можете проверить существование файла, а затем создать файл, если ваш тест обнаружил, что он не существует, потому что это создаст состояние гонки, когда файл может быть создан в промежуточный период между вашей проверкой и созданием.

Кратко взглянув на предоставленную вами ссылку, я действительно считаю, что создание pidfile имеет гонку состояние.

В Python 3.3 в open() добавлен новый режим 'x', который кажется сделать это. Но я не пробовал.

person zigg    schedule 11.01.2013