Seite 1 von 1
FastApi ModuleNotFoundError bei eigenem Modul
Verfasst: Donnerstag 25. Mai 2023, 17:18
von Tintenfisch
Hallo Allerseits
Folgendes Scenario: Ich habe mir eine kleine FastApi Anwendung geschrieben, welche die folgende Paketstruktur hat.
app
|--- package_one
| |--- file_one.py
| |--- __init__.py #empty
|
|--- package_two
| |--- file_two.py
| |--- __init__.py #empty
|
|--- main.py
|--- __init__.py #empty
Importieren tue ich in dem Fall wie folgt: from app.package import file_one
Problem: Beim Starten der Anwedung über uvicorn wird "ModuleNotFoundError: No module named 'app'" geschmissen.
Starte ich die Anwendung jedoch über die Run-Funktion der IDE, in dem Fall PyCharm, läuft sie fehlerfrei durch.
Dazu sei noch gesagt, dass vor der Aufteilung auf verschiedene Module, auch der Start per uvicorn fehlerfrei verlief.
Nun meine Frage an euch, was könnte dort falsch laufen?
Vielen Dank schonmal fürs Lesen.
Re: FastApi ModuleNotFoundError bei eigenem Modul
Verfasst: Donnerstag 25. Mai 2023, 17:26
von __blackjack__
Anmerkung am Rande: Packages in denen neben einer leeren `__init__.py` nur ein Modul liegt, sind ein bisschen sinnfrei.
Ansonsten wäre es interessant zu wissen was Du genau machst, und was da genau ausgegeben wird. Denn da fehlt ja mindestens schon mal der Traceback.
Re: FastApi ModuleNotFoundError bei eigenem Modul
Verfasst: Donnerstag 25. Mai 2023, 18:57
von Tintenfisch
@__blackjack__ Ja genau, ist vielleicht verwirrend, aber die Paketstruktur ist tatsächlich nur ein Muster und entspricht nicht dem Eigentlichen.
Anbei dann noch der Trackback:
Code: Alles auswählen
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\multiprocessing\process.py", line 315, in _bootstrap
self.run()
File "C:\ProgramData\Anaconda3\lib\multiprocessing\process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\XD\AppData\Roaming\Python\Python39\site-packages\uvicorn\_subprocess.py", line 76, in subprocess_started
target(sockets=sockets)
File "C:\Users\XD\AppData\Roaming\Python\Python39\site-packages\uvicorn\server.py", line 59, in run
return asyncio.run(self.serve(sockets=sockets))
File "C:\ProgramData\Anaconda3\lib\asyncio\runners.py", line 44, in run
return loop.run_until_complete(main)
File "C:\ProgramData\Anaconda3\lib\asyncio\base_events.py", line 647, in run_until_complete
return future.result()
File "C:\Users\XD\AppData\Roaming\Python\Python39\site-packages\uvicorn\server.py", line 66, in serve
config.load()
File "C:\Users\XD\AppData\Roaming\Python\Python39\site-packages\uvicorn\config.py", line 471, in load
self.loaded_app = import_from_string(self.app)
File "C:\Users\XD\AppData\Roaming\Python\Python39\site-packages\uvicorn\importer.py", line 24, in import_from_string
raise exc from None
File "C:\Users\XD\AppData\Roaming\Python\Python39\site-packages\uvicorn\importer.py", line 21, in import_from_string
module = importlib.import_module(module_str)
File "C:\ProgramData\Anaconda3\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 850, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "C:\Users\XD\Projects\Python\projects\app\main.py", line 2, in <module>
from app.package_one import file_one
ModuleNotFoundError: No module named 'app'
Re: FastApi ModuleNotFoundError bei eigenem Modul
Verfasst: Donnerstag 25. Mai 2023, 20:36
von __blackjack__
Und wie sieht das aus was Du eingegeben hast um diesen Traceback zu bekommen? War das aktuelle Arbeitsverzeichnis auch das in dem das Verzeichnis `app/` liegt?
Re: FastApi ModuleNotFoundError bei eigenem Modul
Verfasst: Freitag 26. Mai 2023, 10:59
von Tintenfisch
Anbei mal ein Beispielprogramm, welches diesen Fehler hervorbringt.
# main.py
Code: Alles auswählen
from fastapi import FastAPI
from app.package_one import file_one
app = FastAPI()
print('PRINT_MAIN')
print(file_one.print_one())
# file_one.py
Code: Alles auswählen
from app.package_two import file_two
def print_one():
print('FILE_ONE')
print(file_two.print_two())
# file_two.py
Re: FastApi ModuleNotFoundError bei eigenem Modul
Verfasst: Freitag 26. Mai 2023, 11:06
von Sirius3
Du hast immer noch nicht verraten, wie Du Dein Programm aufrufst, und was in Deinem Modulsuchpfad steht.
Re: FastApi ModuleNotFoundError bei eigenem Modul
Verfasst: Freitag 26. Mai 2023, 11:06
von __deets__
Du hast immer noch nicht die Frage beantwortet, was du da genau eingegeben hast. Was soll denn diese Geheimnistuerei um deine eigentliche Dateistruktur und den Aufruf? Du verschwendest hier gerade anderer Leute Zeit und guten Willen. Falls das noch nicht klar geworden ist.
Weil ich raten muss, du rufst sowas wie "python app/main.py" auf. Und damit landet dann pfad-zu-app im sys.path, womit wiederum app kein Package ist.
Sauber macht man sowas mit einer setup.py und zB "pip install -e .", und einem console_scripts-entry-point. Dann wird der Paketpfad Python korrekt bekannt gemacht.
Re: FastApi ModuleNotFoundError bei eigenem Modul
Verfasst: Freitag 26. Mai 2023, 18:49
von Tintenfisch
@__deets__
hehe du, hast sogar richtig geraten
Ein Einrichten einer setup.py und das anschließende installieren des package hat den Fehler behoben.
Anbei mal ein passender Link zum Nachschlagen.
https://packaging.python.org/en/latest ... tuptools/
Re: FastApi ModuleNotFoundError bei eigenem Modul
Verfasst: Freitag 26. Mai 2023, 18:58
von __blackjack__
Wobei es Alternativ ``python -m app.main`` auch getan hätte. Oder ``python -m app`` wenn man ``main.py`` stattdessen ``__main__.py`` genannt hätte.