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.
FastApi ModuleNotFoundError bei eigenem Modul
- __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.
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; }
}
-
- 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:
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'
- __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; }
}
-
- User
- Beiträge: 4
- Registriert: Donnerstag 25. Mai 2023, 14:15
Anbei mal ein Beispielprogramm, welches diesen Fehler hervorbringt.
# main.py
# file_one.py
# file_two.py
# 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())
Code: Alles auswählen
from app.package_two import file_two
def print_one():
print('FILE_ONE')
print(file_two.print_two())
Code: Alles auswählen
def print_two():
print('PRINT_TWO')
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.
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.
-
- 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/
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/
- __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; }
}