Проект FastAPI не видит модули (ModuleNotFoundError: No module named 'shemas')

Uvicorn при запуске проекта не видит модули (Сам Python модули видит): Пример

Само дерево проекта: введите сюда описание изображения

Работаю в VS Code, перед запуском uvicorn всегда запускаю venv и в самом VS code выбран интерпретатор моего окружениявведите сюда описание изображения

Сам код запускаю так:uvicorn app.main:app --reload

Полный текст ошибки:

Traceback (most recent call last):
  
File "C:\Users\sith8\AppData\Local\Programs\Python\Python312\Lib\multiprocessing\process.py", line 314, in _bootstrap
    self.run()
  
File "C:\Users\sith8\AppData\Local\Programs\Python\Python312\Lib\multiprocessing\process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  
File "C:\Users\sith8\PycharmProjects\FastAPI_new\.env\Lib\site-packages\uvicorn\_subprocess.py", line 80, in subprocess_started
    target(sockets=sockets)
  
File "C:\Users\sith8\PycharmProjects\FastAPI_new\.env\Lib\site-packages\uvicorn\server.py", line 65, in run
    return asyncio.run(self.serve(sockets=sockets))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  
File "C:\Users\sith8\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py", line 194, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  
File "C:\Users\sith8\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  
File "C:\Users\sith8\AppData\Local\Programs\Python\Python312\Lib\asyncio\base_events.py", line 685, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  
File "C:\Users\sith8\PycharmProjects\FastAPI_new\.env\Lib\site-packages\uvicorn\server.py", line 69, in serve
    await self._serve(sockets)
  
File "C:\Users\sith8\PycharmProjects\FastAPI_new\.env\Lib\site-packages\uvicorn\server.py", line 76, in _serve
    config.load()
  
File "C:\Users\sith8\PycharmProjects\FastAPI_new\.env\Lib\site-packages\uvicorn\config.py", line 434, in load
    self.loaded_app = import_from_string(self.app)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  
File "C:\Users\sith8\PycharmProjects\FastAPI_new\.env\Lib\site-packages\uvicorn\importer.py", line 22, in import_from_string
    raise exc from None
  
File "C:\Users\sith8\PycharmProjects\FastAPI_new\.env\Lib\site-packages\uvicorn\importer.py", line 19, in import_from_string
    module = importlib.import_module(module_str)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  
File "C:\Users\sith8\AppData\Local\Programs\Python\Python312\Lib\importlib\__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  
File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
  
File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  
File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  
File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
  
File "<frozen importlib._bootstrap_external>", line 995, in exec_module
  
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  
File "C:\Users\sith8\PycharmProjects\FastAPI_new\app\main.py", line 8, in <module>
    from app.users.router import router as router_users
  
File "C:\Users\sith8\PycharmProjects\FastAPI_new\app\users\router.py", line 2, in <module>
    from shemas import SUserRegister

ModuleNotFoundError: No module named 'shemas'

Прошу помочь мне решить эту проблему.


Ответы (1 шт):

Автор решения: insolor

У вас код внутри пакета, поэтому нужно делать импорт не просто по имени, а относительный или абсолютный импорт.

Абсолютный импорт выглядит так:

from app.users.shemas import SUserRegister

Т.е. указывается полный "путь" внутри пакета от app до модуля shemas. Обычно рекомендуют использовать именно абсолютный импорт.


Относительный импорт будет выглядеть так:

from .shemas import SUserRegister

Точка перед shemas обязательна, она обозначает, что модуль нужно искать в текущей папке (пакете). Две точки означали бы, что нужно подняться на уровень выше, искать модуль в пакете app. Три точки тут уже не сработали, потому что это был бы выход из пакета app, а он у вас самый корневой (но в целом при более глубокой вложенности три и более точки тоже возможны).

→ Ссылка