python os.fdopen (os.open ()) нельзя использовать для записи?

Этот вопрос связан с ответом на запись файла с конкретными разрешениями в Python для открытия файла для записи (на python) с конкретными разрешениями.

Код в ответе выглядит так:

with os.fdopen(os.open('foo', os.O_APPEND | os.O_CREAT, 0o644)) as out: out.write("hello\n") 

Этот код в 2.7.1 (моя компания не имеет 2.7.3) производит:

 Traceback (most recent call last): File "<stdin>", line 2, in <module> IOError: File not open for writing 

os.fdopen имеет свой собственный аргумент режима, но настройка, которая не помогает:

 >>> with os.fdopen(os.open('foo', os.O_APPEND | os.O_CREAT, 0o644), 'a') as out: ... out.write("hello\n") ... Traceback (most recent call last): File "<stdin>", line 1, in <module> OSError: [Errno 22] Invalid argument 

Короче говоря, я не смог понять, как писать в файл, который был открыт через os.fdopen и os.open . Есть идеи? Известная ошибка в 2.7.1?

Заранее спасибо!

2 Solutions collect form web for “python os.fdopen (os.open ()) нельзя использовать для записи?”

Вы должны выбрать один из O_RDONLY, O_WRONLY или O_RDWR как аргумент «базового» режима для open ().

Вы явно не сделали этого, поэтому предполагается O_RDONLY (ноль на многих системах). Python os.fdopen видит, что вы указали O_RDONLY и O_APPEND, что немного глупо. Python жалуется на эту комбинацию с ошибкой EINVAL («Недопустимый аргумент»).

(Действительно, если вы strace(1) ваш сценарий – я предполагаю Linux здесь – я подозреваю, что вы увидите, что не встречается «естественный» EINVAL. Вместо этого python выполняет ваш os.open() / open(2) , а затем проверяет флаги (F_GETFL) на дескрипторе файла перед повышением исключения.)

Действительно на самом деле.

 os.fdopen(os.open("a1", os.O_CREAT | os.O_RDWR | os.O_APPEND | os.O_EXCL)) 

работает, пока

 os.fdopen(os.open("a1", os.O_CREAT | os.O_WRONLY | os.O_APPEND | os.O_EXCL)) 

вызывает OSError: [Errno 22] Invalid argument для os.fdopen() .

Поэтому os.fdopen () требует полного доступа для чтения / записи к FD. Если вы этого не сделаете

 os.fdopen(fd, "w") 

который работает с файлами только для записи.

Interesting Posts

Найти системный жесткий диск с Python?

Связывание обратных вызовов для минимизации и максимизации событий в окнах Toplevel

Как разрешить пользователям входить в защищенный флажок-rest-api в Angularjs, используя HTTP-аутентификацию?

Каков правильный способ обращения с Redis в Tornado? (Async – Pub / Sub)

Шкала передачи данных Pandas по дате

Извлечение блоков текста из документов ReST по: ref :?

Установите Python 3.5 с помощью pip на Debian 8

Как я могу разделить эту строку с разделителями-запятыми в Python?

Создание структуры данных в python для использования в шаблоне Jinja2

python конвертировать datetime форматированную строку в секунды

проанализировать с помощью регулярного выражения и распечатать строку

Python и ссылка. Ограничение?

Имя переменной класса Python vs __name__

Синтаксис Python3 в PyCharm

Pythonic способ разбить список после элементов, для которых данный предикат является истинным

Python - лучший язык программирования в мире.