Funktion aus Modul wird doppelt ausgeführt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
crazyyzarc
User
Beiträge: 28
Registriert: Freitag 10. Juli 2015, 21:08
Wohnort: PyLand

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
crazyyzarc
User
Beiträge: 28
Registriert: Freitag 10. Juli 2015, 21:08
Wohnort: PyLand

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

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten