2013-02-23 2 views
24

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

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

ли file object отличается от file descriptor

я имею в виду f = os.open("file.txt",w)

Теперь это файл-файл или его filedescriptor?

+0

Согласно [Документах] (HTTP: //docs.python.org/2/library/os.html#os.open), os.open() возвращает дескриптор файла, тогда как встроенный open() возвращает объект файла. – Octipi

ответ

41

Вы вводите в заблуждение встроенную функцию 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)) 
+0

Вы правы, меня смутило 'open' и' os.open() '. можете ли вы дать мне пример кода, где я могу использовать 'fd', чтобы сделать что-то невозможное с помощью обычного' open'. Я хочу знать, как это работает – user1994660

+0

@ user1994660 Как я уже сказал в ответ, вы не можете передать 'O_EXCL' или другие системные флаги для встроенного' open() '. Что касается 'os.fdopen()', Unix API, таких как 'pipe()', 'dup()' и т. Д., Все возвращают дескрипторы файлов, а не файловые объекты. В этом случае вы должны использовать 'os.fdopen' для преобразования таких дескрипторов в объекты файлов. – user4815162342

Смежные вопросы