Подтвердить что ты не робот

В чем разница между os.open и os.fdopen в python

Я действительно смущен, когда использовать os.open и когда использовать os.fdopen

Я выполнял всю свою работу с os.open, и он работал без каких-либо проблем, но я не могу понять, в каких условиях нам нужны file descriptors и все другие функции, такие как dup и fsync

Является ли file object отличным от file descriptor

i означает f = os.open("file.txt",w)

Теперь f файл или его filedescriptor?

4b9b3361

Ответ 1

Вы вводите в заблуждение встроенную функцию open() с os.open(), предоставляемую модулем os. Они совершенно разные; os.open(filename, "w") недействителен Python (os.open принимает в качестве второго аргумента целочисленные флаги), open(filename, "w") is.

Короче говоря, open() создает новые файловые объекты, os.open() создает дескрипторы файла уровня ОС, а os.fdopen() создает объект файл из файлового дескриптора.

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

Файловые объекты - это классы Python, которые обертывают файловые дескрипторы, чтобы сделать работу с файлами более удобной и менее подверженной ошибкам. Они обеспечивают, например, обработку ошибок, буферизацию, построчное чтение, преобразование кодировки и закрываются при сборе мусора.

Повторить:

  • Встроенный open() принимает имя файла и возвращает новый объект файла Python. Это то, что вам нужно в большинстве случаев.

  • os.open() принимает имя файла и возвращает новый файловый дескриптор. Этот файловый дескриптор может быть передан другим низкоуровневым функциям, таким как os.read() и os.write(), или os.fdopen(), как описано ниже. Это нужно только при написании кода, зависящего от зависимых от операционной системы API, например, с помощью флага O_EXCL до open(2).

  • os.fdopen() принимает существующий файловый дескриптор, обычно создаваемый системными вызовами Unix, такими как pipe() или dup(), и создает вокруг него объект файла Python. Фактически он преобразует дескриптор файла в полный файловый объект, что полезно при взаимодействии с C-кодом или с API-интерфейсами, которые создают только низкоуровневые файловые дескрипторы.

Встроенный open может быть реализован с помощью os.open() (для создания дескриптора файла) и os.fdopen() (чтобы обернуть его в файл-объект):

# equivalent to open(filename, "r")
f = os.fdopen(os.open(filename, os.O_RDONLY))