Seite 1 von 1

"import" führt zu importierende Datei aus

Verfasst: Freitag 3. Juni 2022, 13:10
von NWA
Ich beschäftige mich mit einem Youtube-Video (https://www.youtube.com/watch?v=sugvnHA7ElY) und dort wird..
  • eine Datei first.py wird erstellt
  • in first.py wird eine print-Anweisung geschrieben
  • es wird eine second.py erstellt
  • second wird ausgeführt
  • Es wird print aus first.py ausgeführt!
Wieso????

Re: "import" führt zu importierende Datei aus

Verfasst: Freitag 3. Juni 2022, 13:27
von __deets__
Wieso nicht? Der Code in first wird ausgeführt. Was sonst soll passieren?

Re: "import" führt zu importierende Datei aus

Verfasst: Freitag 3. Juni 2022, 14:47
von __blackjack__
@NWA: Importieren heisst halt den Code auf Modulebene ausführen beim ersten Import, weil irgendwie muss der Inhalt des Moduls ja definiert werden. Weitere Importe liefern dann das beim ersten Import initialisierte Modul.

Re: "import" führt zu importierende Datei aus

Verfasst: Freitag 3. Juni 2022, 15:00
von Kebap
Üblicherweise schreibt man in first.py nicht einfach eine print-Anweisung, sondern man definiert dort Funktionen, usw.
Diese Funktionen kann man dann in second.py benutzen, ohne sie erneut dort definieren zu müssen.

Re: "import" führt zu importierende Datei aus

Verfasst: Freitag 3. Juni 2022, 15:29
von NWA
In meinem Buch steht unter import:
Um sich diese Funktionalität in einem Programm zunutze machen zu können, wird die import-Anweisung in der folgenden Form verwendet: >>import math
...und ich kenne das auch nicht anders. Import war für mich bisher immer ein Pfad zu anderen Dateien. Das da dann automatisch auch gleich der code ausgeführt wird, ist für mich absolut nicht nachvollziehbar und habe ich noch nirgendwo gelesen.

Re: "import" führt zu importierende Datei aus

Verfasst: Freitag 3. Juni 2022, 15:37
von __deets__
Die Gleichsetzung von import mit Pfaden ist falsch. Es gibt eine Vielzahl von Faellen, in denen das nicht so ist. ZB gibt es internalisierte Module, die dem Interpreter von vorneherein einkompiliert sind. Es gibt Namensraumpakete, durch die man aus x beliebig vielen Stellen importieren kann unter dem gleichen Praefix. Es gibt import-hooks, mit denen importe aus praktisch beliebigen Quellen kommen koennen.

Aber wenn ein Modul dann als Quelltext *irgendwie* vorliegt, *dann* wird das natuerlich immer einfach ausgefuehrt. Nur weil man keine Anweisungen da rein schreiben *sollte*, die eine Nebenwirkung haben (aus gutem Grund), aendert das nichts daran, dass das genau das ist, was passiert.

Re: "import" führt zu importierende Datei aus

Verfasst: Freitag 3. Juni 2022, 15:51
von Kebap
Das da dann automatisch auch gleich der code ausgeführt wird, ist für mich absolut nicht nachvollziehbar
Führ mal diese Datei aus:

Code: Alles auswählen

def tolle_funktion():
  print("Hallo Welt!")
Was passiert? Genau, gar nichts (sichtbares).

Du erhältst aber eine neue Funktion in deinen Baukasten, die du wie math dann später bei Bedarf benutzen kannst.

Jetzt vergleiche meine Datei mit first.py - Es gibt einen wichtigen Unterschied, wenn man die erste Zeile weglässt.. :mrgreen:

Re: "import" führt zu importierende Datei aus

Verfasst: Freitag 3. Juni 2022, 16:13
von NWA
Ich schnall das nicht.

Gibt es einen Namen dafür das importiertes einfach ausgeführt wird?

Re: "import" führt zu importierende Datei aus

Verfasst: Freitag 3. Juni 2022, 16:34
von __deets__
Es wird einfach ausgeführt. Was daran ist so kompliziert? Wenn du ein Skript direkt ausführst, und da steht auch nur eine Funktionsdefinition drin, dann passiert doch das gleiche. Sprichwörtlich, das ist nämlich das Modul __main__.

Re: "import" führt zu importierende Datei aus

Verfasst: Freitag 3. Juni 2022, 17:06
von sparrow
Es steht unter anderem hier:
https://docs.python.org/3/tutorial/modules.html#more-on-modules hat geschrieben:A module can contain executable statements as well as function definitions. These statements are intended to initialize the module. They are executed only the first time the module name is encountered in an import statement. (They are also run if the file is executed as a script.)
Deshalb ist es sinnvoll, das Tutorial einmal durch zu arbeiten.

Re: "import" führt zu importierende Datei aus

Verfasst: Freitag 3. Juni 2022, 19:48
von __blackjack__
@NWA: Es *muss* ausgeführt werden, denn Du willst ja auf die Sachen da drin auch zugreifen. Die Sachen in Modulen sind ja aber nur vorhanden weil es ausgeführt wurde. Wo denkst Du denn kommen Konstanten, Funktionen, und Klassen in importierten Modulen sonst her wenn das Modul nicht ausgeführt würde? Das passiert alles dynamisch. Die Zuweisungen von Werten an Namen für Konstanten, und auch ``def`` und ``class`` sind ausführbare Anweisungen. Wenn die ausgeführt werden, existieren Funktionen und Klassen.

Re: "import" führt zu importierende Datei aus

Verfasst: Freitag 3. Juni 2022, 21:02
von NWA
Ok, hab es verstanden. Sparrows Hinweis auf python docs hat es gebracht. Aber es ist für mich immer noch ein ungewöhnliches Verhalten.

Ich habe doch schon das Ernesti Handbuch und lese es wie wild. Aber anscheinend steht da nicht alles drin.

Re: "import" führt zu importierende Datei aus

Verfasst: Freitag 3. Juni 2022, 21:07
von sparrow
Ja, das könnte daran liegen, dass das Buch hier einen eher zweifelhaften Ruf hat.
Das scheint in meinen Augen durchweg so als hätten es Menschen geschrieben, die eigentlich Java programmieren und es gab schon zu viele Bücher darüber - also haben sie das Java-Konzept verzweifelt in Python gequetscht.

Re: "import" führt zu importierende Datei aus

Verfasst: Samstag 4. Juni 2022, 00:05
von __blackjack__
@NWA: Warum findest Du das ungewöhnlich? Beim ausführen einer *.py-Datei auch? Wie sollte es denn beim Importieren als Modul anders funktionieren? Ich fände das eher ungewöhnlich wenn das einen Unterschied machen würde. Und falls es das täte, braucht man plötzlich auch noch einen zusätzlichen Präprozessor. Oder die Sprache wäre wesentlich weniger mächtig. Wenn man einen extra Präprozessor schreiben würde, müsste der sehr ähnliche Aufgaben lösen, die Python ja schon löst. Inklusive ``if``/``else`` und wohl auch `print()`, nur das die dann anders heissen müssten. Da Python aber ``if``/``else`` und `print()` bereits hat, und die beim Ausführen von Modulen schon das richtige machen, warum sollte man da noch eine Sprache parallel einführen wollen die nur beim importieren etwas macht? Und was würden diese Konstrukte machen wenn man das Modul nicht importiert, sondern ausführt?

Re: "import" führt zu importierende Datei aus

Verfasst: Samstag 4. Juni 2022, 21:31
von DeaD_EyE
Code, der nicht ausgeführt werden soll, wenn das Modul importiert wird:

Code: Alles auswählen

# code
def main():
    ...


if __name__ == "__main__":
    main()
Wenn man das Modul importiert, wird der Quellcode in Python-Bytecode übersetzt und danach wird das Modul ausgeführt. Das ist auch nichts Ungewöhnliches. Man muss es nur wissen. Das Attribut __name__ ist "__main__", wenn das Modul als Programm ausgeführt wird.

Wenn man dieses Modul importiert, ist __name__ ="modulname".
Also ist die Bedingung __name__ == "modulname" False und der Code im if-Block wird nicht ausgeführt. Die Funktion main wird dann nicht aufgerufen.

Wichtig ist, dass die Funktionsdefinition den Code innerhalb der Funktion nicht ausführt. Der Code innerhalb der Funktion wird erst dann ausgeführt, wenn man die Funktion aufruft. Deswegen kann man oben main definieren, aber diese nur bedingt aufrufen.

Wenn dich das stört, dann schau dir mal JavaScript an.