Используйте случай для низкоуровневых 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
и т.д.? Раньше я думал, что это необходимо для деамонизации процесса, но Я уже не так уверен. Есть ли какая-либо задача, которая может быть выполнена только с использованием низкоуровневого ввода-вывода, а не с обертками более высокого уровня?
Ответы
Ответ 1
Основные отличия:
- Низкий уровень доступа к файлам небуферирован.
- Низкий уровень доступа не переносится.
- Низкий уровень позволяет более мелкозернистый контроль, например. блокировать или не блокировать чтение
Используйте случаи для низкого уровня io:
- Файл является блочным устройством
- Файл представляет собой сокет
- Файл является tty
- ...
Во всех этих случаях вы можете захотеть иметь более мелкозернистый контроль (над буферизацией и блокировкой).
Вам, вероятно, никогда не понадобятся функции низкого уровня для обычных файлов. Я думаю, что в большинстве случаев прецедентом будет какой-то материал драйвера устройства. Однако это лучше сделать в C. Но я также вижу пример использования для python, например. для быстрого прототипирования драйверов устройств.
Ответ 2
Я использую его, когда мне нужно использовать O_CREAT | O_EXCL
для атомарного создания файла, если он не существует. Вы не можете проверить существование файла, а затем создать файл, если ваш тест обнаружил, что он не существует, потому что это создаст условие гонки, в котором файл может быть создан в промежуточный период между вашим проверкой и созданием.
Кратко глядя на ссылку, которую вы предоставили, я считаю, что создание pidfile имеет условие гонки.
В Python 3.3 есть новый 'x'
режим, добавленный к open()
, который, кажется, делает это. Я даже не пробовал.