Seite 1 von 1

Funktion aus Modul wird doppelt ausgeführt

Verfasst: Donnerstag 18. Juni 2020, 10:52
von crazyyzarc
Hallö'chen. Kurz um: ich arbeite gerade mit Packages und Modulen. Dabei stieß ich auf das Verhalten, dass beim import eines Moduls und dem aufruf der Funktion die Funktion doppelt ausgeführt wird. Wieso und weshalb? Ich rufe die Funktion ja nur 1x auf und nicht 2x

Und noch ne Frage: sollte nicht die Main Methode dabei automatisch aufgerufen werden? Hier tut's sies nicht

__init__.py

Code: Alles auswählen

import Projekte.Package.print_out.say_sth as sag_was


sag_was.say_something()
say_sth.py

Code: Alles auswählen

def say_something():
    print("Hier sage ich irgendwas")


if __name__ == "__main__":
    print("Hello du hast das Projekt importiert")

Output:
Hier sage ich irgendwas
Hier sage ich irgendwas

Process finished with exit code 0

Re: Funktion aus Modul wird doppelt ausgeführt

Verfasst: Donnerstag 18. Juni 2020, 11:05
von __deets__
Das Skript, das du an den Python Interpreter uebergibst, bekommt einen speziellen Namen - __main__. Auf den pruefst du ja auch, und da das ein Import ist, wird die Klausel nicht ausgefuehrt.

Das say_something mehrfach ausgefuehrt wird kann nur daran liegen, das du das unter vierschiedenen Namen mehrfach importierst.

Re: Funktion aus Modul wird doppelt ausgeführt

Verfasst: Donnerstag 18. Juni 2020, 11:22
von __blackjack__
@crazyyzarc: Ich weiss das ist nur ein Beispiel, aber eine Funktionsobjekt dessen qualifizierter Name `Projekte.Package.print_out.say_sth.say_something()` ist — so was sollte man nicht mal im Spass machen.

Wenn man die Namen ein bisschen ernster nimmt, dann sollte `Projekte` da nicht drin sein wenn das tatsächlich ein Ordner mit Projekten ist.

Wie führst Du das eigentlich aus? Korrekt wäre ``python3 -m Projekte.Package.print_out.say_sth`` und dabei sollte das aktuelle Arbeitsverzeichnis sich auf keinen Fall irgendwo innerhalb der Verzeichnisstruktur mit den Packages/Modulen befinden. Sonst → Chaos.

Die Aussage in dem `print()` im ``if __name__ …``-Guard ist falsch. Wenn diese Ausgaben gemacht wird, wurde das Modul ja gerade *nicht* importiert, sondern als Programm ausgeführt.

Re: Funktion aus Modul wird doppelt ausgeführt

Verfasst: Donnerstag 18. Juni 2020, 12:13
von Sirius3
Was rufst Du denn hier auf? Du hast eine __init__.py und ein Untermodul say_sth.py und beides sind ja keine Scripte.
Also wie sieht das Skript aus?
Auch __init__.py sollte keine Seiteneffekte haben.

Re: Funktion aus Modul wird doppelt ausgeführt

Verfasst: Donnerstag 18. Juni 2020, 12:15
von crazyyzarc
__deets__ hat geschrieben: Donnerstag 18. Juni 2020, 11:05 Das Skript, das du an den Python Interpreter uebergibst, bekommt einen speziellen Namen - __main__. Auf den pruefst du ja auch, und da das ein Import ist, wird die Klausel nicht ausgefuehrt.

Das say_something mehrfach ausgefuehrt wird kann nur daran liegen, das du das unter vierschiedenen Namen mehrfach importierst.
Okay danke

__deets__ hat geschrieben: Donnerstag 18. Juni 2020, 11:05 `Projekte.Package.print_out.say_sth.say_something()` ist — so was sollte man nicht mal im Spass machen.
Ich muss anmerken, dass ich PyCharm im Oberordner "Python" mit den Unterordner "Basic" und eben auch "Projekte" geöffnet habe und dementsprechend Dateien selektiere
Je nach Ort des Startfensters, variiert ja auch der relative Pfad zum Modul
Wie machst du denn das?

Re: Funktion aus Modul wird doppelt ausgeführt

Verfasst: Donnerstag 18. Juni 2020, 12:40
von __blackjack__
@crazyyzarc: Module startet man wie gezeigt mit der ``-m`` Option über den voll qualifizierten Namen und das aktuelle Arbeitsverzeichnis befindet sich nie innerhalb von irgendwelchen Packages, weil das wie schon gesagt zu Chaos führt.

Ohne ``-m``, also über den Dateinamen, startet man nur Programme. Programme liegen nicht in Packages sondern sind eigenständig. Auch hier gilt aber: das aktuelle Arbeitsverzeichnis darf nicht innerhalb eines Packages sein.