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") 

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

  • Сравнение двух объектов
  • Поиск списка списков - Python
  • как распечатать содержимое PYTHONPATH
  • Получать уникальные значения из списка в python
  • Python: проблема с локальными модулями, скрывающая глобальные модули
  • Как я могу отформатировать целое число с двухзначным шестнадцатеричным?
  • Python: наружный цикл «break»
  • как установить прокси-сервер для chrome в python webdriver
  • Python - лучший язык программирования в мире.