> **Источник:** https://python-all.ru/2.7/library/posixfile.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 36.12. [`posixfile`](https://python-all.ru/2.7/library/posixfile.html#module-posixfile) – Объекты, похожие на файлы, с поддержкой блокировки

Устарело с версии 1.5: Операция блокировки, предоставляемая этим модулем, выполняется лучше и более портативно с помощью вызова [`fcntl.lockf()`](https://python-all.ru/2.7/library/fcntl.html#fcntl.lockf).

Этот модуль реализует дополнительную функциональность поверх встроенных файловых объектов. В частности, он реализует блокировку файлов, управление флагами файла и простой интерфейс для дублирования файлового объекта. Модуль определяет новый файловый объект – объект posixfile. Он обладает всеми стандартными методами файловых объектов и добавляет описанные ниже методы. Этот модуль работает только в некоторых вариантах Unix, поскольку использует [`fcntl.fcntl()`](https://python-all.ru/2.7/library/fcntl.html#fcntl.fcntl) для блокировки файлов.

Для создания экземпляра объекта posixfile используйте функцию [`posixfile.open()`](https://python-all.ru/2.7/library/posixfile.html#posixfile.open). Полученный объект внешне и по поведению примерно соответствует стандартному файловому объекту.

Модуль [`posixfile`](https://python-all.ru/2.7/library/posixfile.html#module-posixfile) определяет следующие константы:

#### `posixfile.SEEK_SET`

Смещение вычисляется от начала файла.

#### `posixfile.SEEK_CUR`

Смещение вычисляется от текущей позиции в файле.

#### `posixfile.SEEK_END`

Смещение вычисляется от конца файла.

Модуль [`posixfile`](https://python-all.ru/2.7/library/posixfile.html#module-posixfile) определяет следующие функции:

#### `posixfile.open(filename[, mode[, bufsize]])`

Создаёт новый объект posixfile с заданными именем файла и режимом. Аргументы *имя\_файла*, *режим* и *размер\_буфера* интерпретируются так же, как встроенной функцией [`open()`](https://python-all.ru/2.7/library/functions.html#open).

#### `posixfile.fileopen(fileobject)`

Создаёт новый объект posixfile на основе заданного стандартного файлового объекта. Полученный объект имеет то же имя файла и режим, что и исходный файловый объект.

Объект posixfile определяет следующие дополнительные методы:

#### `posixfile.lock(fmt[, len[, start[, whence]]])`

Блокирует указанный участок файла, на который ссылается файловый объект. Формат описан ниже в таблице. Аргумент *длина* задаёт длину блокируемого участка. По умолчанию `0`. *начало* задаёт начальное смещение участка; по умолчанию `0`. Аргумент *откуда* указывает, относительно чего вычисляется смещение. Он принимает одну из констант [`SEEK_SET`](https://python-all.ru/2.7/library/posixfile.html#posixfile.SEEK_SET), [`SEEK_CUR`](https://python-all.ru/2.7/library/posixfile.html#posixfile.SEEK_CUR) или [`SEEK_END`](https://python-all.ru/2.7/library/posixfile.html#posixfile.SEEK_END). По умолчанию [`SEEK_SET`](https://python-all.ru/2.7/library/posixfile.html#posixfile.SEEK_SET). Дополнительную информацию об аргументах см. в справочной странице *fcntl(2)* вашей системы.

#### `posixfile.flags([flags])`

Устанавливает указанные флаги для файла, на который ссылается файловый объект. Новые флаги объединяются по OR со старыми, если не указано иное. Формат описан ниже в таблице. Если аргумент *флаги* не указан, возвращается строка с текущими флагами (это эквивалентно модификатору `?`). Дополнительную информацию о флагах см. в справочной странице *fcntl(2)* вашей системы.

#### `posixfile.dup()`

Дублирует файловый объект, а также связанные с ним файловый указатель и файловый дескриптор. Полученный объект ведёт себя так, как если бы он был открыт заново.

#### `posixfile.dup2(fd)`

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

#### `posixfile.file()`

Возвращает стандартный файловый объект, на котором основан объект posixfile. Это иногда необходимо для функций, которые требуют стандартный файловый объект.

Все методы возбуждают [`IOError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IOError) при неудаче запроса.

Символы формата для метода `lock()` имеют следующие значения:

| Формат | Значение |
| --- | --- |
| `u` | разблокировать указанную область |
| `r` | запросить блокировку чтения для указанного участка |
| `w` | запросить блокировку записи для указанного участка |

Кроме того, к формату можно добавить следующие модификаторы:

| Модификатор | Значение | Примечания |
| --- | --- | --- |
| `\|` | ожидать, пока блокировка не будет предоставлена |  |
| `?` | возвращает первую блокировку, конфликтующую с запрошенной блокировкой, или `None`, если конфликта нет. | (1) |

Примечание:

1. Возвращаемая блокировка имеет формат `(mode, len, start, whence, pid)`, где *режим* – символ, представляющий тип блокировки ('r' или 'w'). Этот модификатор предотвращает предоставление запроса; он предназначен только для запроса информации.

Символы формата для метода `flags()` имеют следующие значения:

| Формат | Значение |
| --- | --- |
| `a` | флаг только добавления |
| `c` | флаг закрытия при exec |
| `n` | флаг без задержки (также называется неблокирующим флагом) |
| `s` | флаг синхронизации |

Кроме того, в формат можно добавить следующие модификаторы:

| Модификатор | Значение | Примечания |
| --- | --- | --- |
| `!` | отключает указанные флаги ‘off’, вместо ‘on’ по умолчанию | (1) |
| `=` | заменяет флаги, вместо стандартной операции ‘OR’ | (1) |
| `?` | возвращает строку, в которой символы представляют установленные флаги. | (2) |

Примечания:

1. Модификаторы `!` и `=` являются взаимоисключающими.
2. Эта строка представляет флаги после того, как они могли быть изменены тем же вызовом.

Примеры:

```python
import posixfile

file = posixfile.open('testfile', 'w')
file.lock('w|')
...
file.lock('u')
file.close()
```
