FastApi ModuleNotFoundError bei eigenem Modul

Django, Flask, Bottle, WSGI, CGI…
Antworten
Tintenfisch
User
Beiträge: 4
Registriert: Donnerstag 25. Mai 2023, 14:15

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
Tintenfisch
User
Beiträge: 4
Registriert: Donnerstag 25. Mai 2023, 14:15

@__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'

Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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?

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
Tintenfisch
User
Beiträge: 4
Registriert: Donnerstag 25. Mai 2023, 14:15

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

Code: Alles auswählen

def print_two():
    print('PRINT_TWO')
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast immer noch nicht verraten, wie Du Dein Programm aufrufst, und was in Deinem Modulsuchpfad steht.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Tintenfisch
User
Beiträge: 4
Registriert: Donnerstag 25. Mai 2023, 14:15

@__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/
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
Antworten