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

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

  • Как установить sys.argv, чтобы я мог его протестировать?
  • Python получает Killed (возможно, утечка памяти)
  • Ярлык для if __name__ == '__main__':
  • Словарь Python 2.5 для словаря 2
  • Обеспечение доступа всех переменных к пространству имен
  • Утечка памяти в библиотеке Google ndb
  • Почему возможна итерация вдоль строки?
  • python: поиск подстроки внутри строки
  • Что такое по умолчанию __hash__ в python?
  • Как перенести строку вправо в python?
  • как унифицировать список dict в python
  • Python - лучший язык программирования в мире.