#Что произошло и когда проявляется ошибка
При запуске Python из другого каталога импорт локального модуля может не найти файл: важны расположение стартового скрипта, способ запуска (-m) и реальный sys.path, а не только текущая папка оболочки.
#Причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
Неверная точка входаPython добавляет в sys.path каталог запускаемого файла; у python -m и python script.py путь поиска может различаться. | Падает только при запуске файла напрямую из подпапки | Запускать пакет из корня проекта через -m. |
| Локальное имя конфликтует с библиотекойФайл проекта затеняет стандартный или установленный пакет. | Импорт открывает не тот utils.py, json.py или email.py | Переименовать конфликтующий файл и поправить импорты. |
| Отсутствует правильная структура пакетаПодпакет ожидает импорты относительно имени пакета. | Работает лишь при ручном изменении PYTHONPATH | Использовать корректный пакет и относительные импорты внутри него. |
#Подробная пошаговая диагностика и исправление
- 1. Уточните расположение файлов и командуОткройте папку проекта в Проводнике или файловом менеджере редактора. Запишите путь к запускаемому файлу и модулю, который не импортируется. В терминале перейдите в корень проекта; проверьте, что локальный модуль находится внутри проекта, а имя в
importсовпадает с именем файла без.py. - Linux/macOS: выполняйте в обычном терминале; Windows замените pwd на cdLinux · Терминал (Bash)КомандаLinux/macOS: выполняйте в обычном терминале; Windows замените pwd на cd. Администратор не нужен.
pwdpython -c "import os,sys; print(os.getcwd()); print(sys.executable); print(*sys.path,sep=chr(10))"
- 2. Определите, какой способ запуска ломаетсяВ каталоге проекта выполните стартовый модуль так, как обычно. Если ошибка возникает при запуске
python tools/run.py, сравните сpython -m tools.runиз корня проекта: второе выполняет модуль как часть пакета. Если команда-mне работает, проверьте имя пакета и вложенных каталогов.Linux · Терминал (Bash)КомандаЗаменитеtools.runреальным полным именем модуля; пример применим к проекту с tools/run.py.python -m tools.run
- 3. Проверьте фактический поиск модуляСоздайте временный
diagnose_import.pyрядом со стартовым файлом, вставьте пример и запустите тем же способом.find_specпокажет путь найденного модуля илиNone; не импортируйте его содержимое ради проверки. Если обнаружитсяjson.pyпроекта вместо стандартного json, переименуйте файл и соответствующие импорты. - Пример кода по темеPythonОбразец кода для файла .py в тестовой копии проекта; перед внедрением замените имена файлов на реальные.
import importlib.util, os, sys print("cwd:", os.getcwd()) print("python:", sys.executable) print("sys.path:", sys.path) print("utils:", importlib.util.find_spec("utils"))
- 4. Исправьте импорты внутри пакетаЕсли файлы
app/main.pyиapp/helpers.pyпринадлежат одному пакету, используйте вmain.pyfrom . import helpers, а запускайте пакет из родительского каталога какpython -m app.main. Не вставляйте в продакшен бездумныйsys.path.appendи не меняйте глобальную PYTHONPATH ради обхода ошибки. - Пример кода по темеPythonОбразец кода для файла .py в тестовой копии проекта; перед внедрением замените имена файлов на реальные.
from . import helpers # запуск из каталога, содержащего папку app: # python -m app.main
- 5. Повторите запуск из обоих местЗакройте интерактивный Python, чтобы исключить старые значения
sys.modules. Из корня проекта и из каталога, из которого запускается задача, воспроизведите штатную команду. Убедитесь, что исчезлоModuleNotFoundError, а импорт указывает на нужный файл проекта, не на одноимённую библиотеку.
#Как проверить, что проблема устранена
Обе предусмотренные команды запуска отрабатывают, а тест выводит путь к нужному модулю; не требуется ручное добавление случайных каталогов.
#Если исправление не помогло
Если нужен запуск из произвольной папки, используйте абсолютный путь к проекту и точку входа с -m либо корректно устанавливаемый пакет. Если модуль отсутствует в виртуальном окружении, переходите к проверке окружения, а не меняйте импорты.