Import zeigt Fehler, funktioniert aber

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
Selectet
User
Beiträge: 4
Registriert: Montag 5. September 2022, 14:07

Hallo zusammen,

Ich möchte ein eigenes Modul in das Hauptprogramm importieren, das klappt auch soweit, allerdings wird bei "import taschenrechner" das Modul mit einem Fehler angezeigt 'Import "taschenrechner" could not be resolved Pylance(reportMissingImport)".
Hier der Code:

Code: Alles auswählen

import sys
sys.path.insert(0,'C:/Users/Admin/Desktop/python_projekte/module')
import taschenrechner

ausgabe = taschenrechner.addieren(20,3)

print(ausgabe)
Kann mir jemand sagen warum der Name nicht aufegelöst werden kann? Oder ist das normal?
Als IDE nutze ich Visual Studio Code
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Selectet: Das wird Dir von der IDE angezeigt, nicht von Python. Python findet das Modul weil es den Code *ausführt*. Und da fügst Du am Anfang etwas zu `sys.path` hinzu. Pylance analysiert den Code statisch und weiss nichts davon was passiert wenn man den Code tatsächlich ausführt und findet das Modul deshalb nicht.

Das bei einer statischen Analyse von Quelltext einer sehr dynamischen Programmiersprache Fehler nicht erkannt, oder aber korrekter Code als fehlerhaft erkannt werden kann ist normal.

Was aber eher nicht so normal ist, ist das hinzufügen von Pfaden zu `sys.path` auf diese Weise. Wenn man Module (oder Packages) geschrieben hat, die in anderen Programmen benutzt werden, dann installiert man die normalerweise, und fügt keine Pfade manuell zu `sys.path` im Programm hinzu.

Das Programm geht übrigens kürzer, weil es die Funktion bereits in der Standardbibliothek gibt:

Code: Alles auswählen

from operator import add as addieren

print(addieren(20,3))
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Selectet
User
Beiträge: 4
Registriert: Montag 5. September 2022, 14:07

__blackjack__ hat geschrieben: Sonntag 8. Januar 2023, 14:31 @Selectet: Das wird Dir von der IDE angezeigt, nicht von Python. Python findet das Modul weil es den Code *ausführt*. Und da fügst Du am Anfang etwas zu `sys.path` hinzu. Pylance analysiert den Code statisch und weiss nichts davon was passiert wenn man den Code tatsächlich ausführt und findet das Modul deshalb nicht.

Das bei einer statischen Analyse von Quelltext einer sehr dynamischen Programmiersprache Fehler nicht erkannt, oder aber korrekter Code als fehlerhaft erkannt werden kann ist normal.
Erstmal danke dafür :)
__blackjack__ hat geschrieben: Sonntag 8. Januar 2023, 14:31 Was aber eher nicht so normal ist, ist das hinzufügen von Pfaden zu `sys.path` auf diese Weise. Wenn man Module (oder Packages) geschrieben hat, die in anderen Programmen benutzt werden, dann installiert man die normalerweise, und fügt keine Pfade manuell zu `sys.path` im Programm hinzu.

Das Programm geht übrigens kürzer, weil es die Funktion bereits in der Standardbibliothek gibt:

Code: Alles auswählen

from operator import add as addieren

print(addieren(20,3))
Wie installiere ich denn meine eigene Module?
Und ich wollte mit dem Programm nur das importieren eines eigenen Moduls testen, die Funktion ist dabei Nebensache, trotzdem danke.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Selectet: Paketieren, verteilen, und installieren von Modulen/Packages ist ein etwas umfangreicheres Thema. Da gibt's Dokumentation, angefangen bei der Python-Dokumentation selbst und dann natürlich „The Python Packaging User Guide“. Wie man venvs erstellt und benutzt wäre vorher auch nicht schlecht zu wissen.

Vielleicht solltest Du aber erst einmal damit anfangen Dich mit Packages auseinanderzusetzen. Da importiert man ja auch Module, muss aber weder an `sys.path` rumfummeln, noch irgendetwas installieren.

Noch einfacher ist es Module zu importieren, die im gleichen Verzeichnis liegen wie das Modul, welches als Programm ausgeführt wird. Aber das macht man eher nicht, weil alle diese Module auf ”oberster” Ebene mit den installierten Modulen und Packages konkurrieren, und man sich damit leicht Probleme einfangen kann, wenn man ein Modul so genannt hat wie ein anderes Modul das mit der Standardbibliothek kommt, oder installiert wurde. Wenn man ein eigenes Programm auf mehrere Module aufteilt, sollte man das besser gleich in einem Package zusammenfassen, um nur einen Namen zu haben, der eindeutig sein muss.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Selectet
User
Beiträge: 4
Registriert: Montag 5. September 2022, 14:07

Dankeschön, das werde ich mir nochmal genauer ansehen.
Antworten