#Что произошло и когда проявляется ошибка
FileNotFoundError у Python-службы часто связан с относительным путём: рабочий каталог системной службы отличается от того, где разработчик запускает скрипт вручную.
#Причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
Используется относительный путьОткрытие относительного файла зависит от os.getcwd(). | Вручную config.json находится, в службе — нет | Строить путь относительно __file__ или задавать рабочую папку службы. |
| Файл не включён в развертываниеКонфигурация/данные не скопированы на сервер. | Ошибка сохраняется даже при абсолютном пути | Проверить наличие, права и путь перед запуском. |
| Служба запускается под другой учётной записьюБуквы дисков и домашние папки пользователя могут отсутствовать. | Файл на сетевом диске доступен только вручную | Использовать доступный путь и права именно службы. |
#Подробная пошаговая диагностика и исправление
- 1. Сохраните путь из tracebackНайдите последнюю строку
FileNotFoundError: [Errno 2] ...и вызовopen()выше неё. Если ошибка появилась после перезапуска службы, проверьте её рабочий каталог и учётную запись. Не записывайте содержимое конфигурации с секретами в журнал.
- 2. Выведите рабочий каталог и расположение скриптаВ тестовой копии поставьте короткую диагностику до чтения файла. Она покажет, где работает процесс и где лежит сама программа. Применимо к обычному
.py-скрипту; в упакованном приложении расположение ресурсов может определяться иначе. - Пример кода по темеPythonОбразец кода для файла .py в тестовой копии проекта; перед внедрением замените имена файлов на реальные.
from pathlib import Path import os, sys print("cwd:", os.getcwd()) print("script:", Path(__file__).resolve()) print("python:", sys.executable)
- 3. Создавайте путь от файла программыЕсли
config.jsonдействительно лежит рядом со скриптом, открывайте его черезPath(__file__).resolve().parent. Для структуры проекта с отдельной папкойconfigдобавьте соответствующий сегмент, предварительно сверив реальное расположение. - Пример кода по темеPythonОбразец кода для файла .py в тестовой копии проекта; перед внедрением замените имена файлов на реальные.
from pathlib import Path config = Path(__file__).resolve().parent / "config.json" if not config.is_file(): raise FileNotFoundError(f"Не найден файл конфигурации: {config}") text = config.read_text(encoding="utf-8")
- 4. Проверьте конфигурацию systemd или службы WindowsВ Linux откройте описание конкретного юнита в
systemctl cat имя.serviceбез изменения параметров. ПроверьтеWorkingDirectory=иExecStart=; если нужна правка, сначала сделайте резервную копию, затем используйте отдельный drop-in черезsystemctl editпод администратором. В Windows найдите путь исполняемого файла в свойствах службы; назначайте абсолютные пути к данным в конфигурации приложения.Linux · Терминал (Bash)КомандаLinux с systemd; замените имя службы, команда только читает конфигурацию и обычно не требует sudo.systemctl cat myapp.service
- 5. Проверьте файл и права под учётной записью службыУбедитесь, что конфигурация действительно существует и читается именно тем пользователем, от которого работает служба. Не исправляйте отсутствие файла массовым
chmod 777и не переносите секретную конфигурацию в общедоступный каталог. После изменения перезапустите службу по штатной процедуре и проверьте журнал запуска.
#Как проверить, что проблема устранена
При запуске службы config.json найден по предсказуемому пути, а приложение проходит этап чтения конфигурации.
#Если исправление не помогло
Если путь указывает на сетевое хранилище, отдельно проверяйте готовность сети и права учётной записи службы; «нет файла» и «нет прав» — разные неисправности.