#Что произошло и когда проявляется ошибка
PermissionError при создании файла означает, что процессу не разрешено записывать в выбранное место или операция запрещена политикой доступа; повышать права на всю папку обычно не требуется.
#Причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Запись в защищённый каталогУ пользователя отсутствует право записи. | Ошибка указывает на /etc, Program Files, системный корень | Выбрать пользовательский или выделенный каталог данных. |
| Путь указывает на каталог либо занятОперационная система отвергает попытку открыть каталог как файл. | В имени файла пропущено расширение или вместо файла задана папка | Проверить is_dir и целевой путь. |
| Ограничение службы и точки монтированияВладелец процесса, ACL, защищённые каталоги или read-only mount отличаются. | Вручную работает, в службе или контейнере ошибка | Диагностировать права конкретного процесса и тома. |
#Подробная пошаговая диагностика и исправление
- 1. Посмотрите точный путь в исключенииЗапустите скрипт в обычном терминале из рабочей папки и найдите
PermissionError: [Errno 13] Permission denied: .... Скопируйте только путь без персональных данных. Убедитесь, что это ожидаемая папка вывода, а не случайный путь относительно другого рабочего каталога.
- 2. Проверьте целевую папку без перезаписи данныхСоздайте временный
check_path.pyв рабочей папке и укажите каталог назначения. Программа только показывает абсолютный путь, наличие, тип и родительский каталог, ничего не удаляет. - Пример кода по темеPythonОбразец кода для файла .py в тестовой копии проекта; перед внедрением замените имена файлов на реальные.
from pathlib import Path p = Path("output/result.txt").resolve() print("Путь:", p) print("Родитель существует:", p.parent.exists()) print("Это каталог:", p.is_dir())
- 3. Выберите папку данных пользователяДля локального скрипта попробуйте
Path.home()/"Documents"/"my-script"при существующем Documents либоPath.home()/"my-script". Создайте новую папку сmkdir(parents=True, exist_ok=True)и запишите пробный файл с новым именем. Это изменяет только ваш пользовательский каталог. - Режим x не перезапишет существующий файл; при повторном тесте задайте другое имяPythonРежим x не перезапишет существующий файл; при повторном тесте задайте другое имя.
from pathlib import Path folder = Path.home() / "my-script" folder.mkdir(parents=True, exist_ok=True) probe = folder / "write-test.txt" with probe.open("x", encoding="utf-8") as f: f.write("проверка\n") print(probe)
- 4. Для службы выясните пользователя и права именно папкиЕсли скрипт запускается службой, сначала выясните учётную запись процесса в диспетчере служб Windows или параметре
User=systemd. Проверьте, что именно этой учётной записи доступна папка вывода. Для владельца проекта создайте выделенную директорию данных; не используйтеchmod 777, массовыйchownили запуск службы от root ради проверки.
- 5. Верните рабочий путь в конфигурацию и перепроверьтеПосле успешного пробного файла измените путь сохранения в настройке приложения на выделенный каталог. Выполните одну обычную запись и откройте полученный файл. Пробный файл можно удалить вручную после проверки при уверенности, что он не нужен.
#Как проверить, что проблема устранена
В рабочей среде создаётся новый файл в выделенной папке и содержимое открывается без PermissionError.
#Если исправление не помогло
Если даже домашняя папка недоступна, проверьте свободное место, права, доступность сетевой папки, антивирус и ограничения контейнера; передавайте администратору точный путь и учётную запись, не требуйте глобальных прав.