Я считаю, что проблема в том, что вы пытаетесь записать существующий файл в каталоге /tmp/
. Обычно /tmp/
будет иметь установленный бит разрешений. Это означает, что только владелец файла имеет разрешение на запись или удаление его. Групповые разрешения на запись для файлов не имеют значения, если в родительском каталоге установлен бит закрепления.
Так что, если это содержимое вашего / tmp
$ ls -al /tmp
drwxrwxrwt 5 root root 760 Apr 30 12:00 .
drwxr-xr-x 21 root root 4096 Apr 30 12:00 ..
-rw-rw---- 2 1001 www-data 80 May 8 12:00 testfile.txt
Мы можем предположить, что пользователи в группе www-data
должны иметь возможность писать в testfile.txt
. Но это не так, поскольку .
(сам каталог / tmp /) имеет установленный бит закрепления (это указывает t
в разделе прав доступа).
Причина, по которой этот бит установлен, заключается в том, что каждый должен иметь возможность записывать туда файлы, но не должен беспокоиться о том, что другие пользователи могут изменять наши временные файлы.
Чтобы избежать ошибок прав доступа, вы можете использовать стандартный модуль tempfile . Этот код создаст уникальное имя файла, например testfile.JCDxK2.txt
, поэтому не имеет значения, существует ли testfile.txt
.
#!/usr/bin/env python
import tempfile
with tempfile.NamedTemporaryFile(
mode='w',
prefix='testfile.',
suffix='.txt',
delete=False,
) as file:
file.write("Hello World")