Вариант использования для низкого уровня 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 для низкоуровневого ввода-вывода?, но на самом деле не получить ответ.

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

2 ответа

Решение

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

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

Варианты использования для низкого уровня io:

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

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

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

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

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

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

Другие вопросы по тегам