Unterschied zwischen Python bash und IDLE bei Import

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
Sinnentlehrt
User
Beiträge: 67
Registriert: Mittwoch 30. Januar 2013, 22:32

Hallo Leute,

habe wohl irgend etwas mal wieder vergessen. Kurz gesagt, dieser 3 Zeiler, genannt funktion3.py:

Code: Alles auswählen

def funktion3(a, b, *weitere): 
    print "Feste Parameter:", a, b 
    print "Weitere Parameter:", weitere
Bei der Python bash:

Code: Alles auswählen

>>> import funktion3
>>> funktion3(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable
>>> 
Bei der IDLE verhält es sich erst genauso. Dann führe ich das Skript über F5 aus, die IDLE macht einen Neustart und alles verhält sich so wie gedacht.

Code: Alles auswählen

>>> funktion3(2, 3)
Feste Parameter: 2 3
Weitere Parameter: ()
>>> 
Warum?? :K

Grüsse,
Du weißt das du vergessen hast einzukaufen, wenn du dich morgens mit Geschirrspülmittel duscht.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Sinnentlehrt,

Du denkst einfach falsch. import funktion3 importiert das Modul „funktion3“. Dieses enthält die
Funktion function3 die Du dann aufrufen kannst:

Code: Alles auswählen

>>> import funktion3
>>> funktion3.funktion3(2, 3)
Feste Parameter: 2 3
Weitere Parameter: ()
>>>
IDLE macht es anders, weil es die Definitionen eines vorhergehenden Aufrufs sich merkt. Mit F5 wird
also funktion3 als Funktion direkt in den globalen IDLE-Namensraum gebunden und kann dann auch benutzt werden.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das kein Unterschied zwischen Python Shell (nicht bash!) und IDLE, sondern du machst zwei verschiedene Sachen:
In der Python-Shell importierst du das Modul und solltest per `funktion3.funktion3` auf diese Funktion zugreifen, in IDLE fuehrst du den Code aus. Letzteres ist eher ein Copy+Paste in die Shell als ein Ausfuehren der Datei.
BlackJack

@Sinnentlehrt: Es gibt keine „Python bash”, das heist Python-Shell. Bash ist eine Kommandoshell die nichts mit Python zu tun hat.

Du hast ein Modul mit dem Namen `funktion3` und darin eine Funktion mit dem Namen `funktion3`. Mit ``import`` importierst Du das Modul und dann versuchst Du das *Modul* aufzurufen. Was im übrigen genau das ist was Dir die Fehlermeldung sagt: Module sind nicht aufrufbar. Du musst entweder die Funktion über das Modul ansprechen, die Namen auf Modulebene sind Attribute vom Modulobjekt, oder nicht das Modul sondern die Funktion aus dem Modul in den aktuellen Namensraum importieren. Also:

Code: Alles auswählen

import funktion3
funktion3.funktion3(42, 23, 4711)
# oder
from funktion3 import funktion3
funktion3(42, 23, 4711)
IDLE macht leider *keinen* Neustart sondern führt das Modul anscheinend im Python-Shell-Namensraum aus, wodurch dann die Funktion dort einfach so auf magische Weise verfügbar ist. Was ich ja irgendwie für ziemlich kaputtes Verhalten halte. Aber so ist IDLE halt.
Sinnentlehrt
User
Beiträge: 67
Registriert: Mittwoch 30. Januar 2013, 22:32

Alles klar :mrgreen: :mrgreen: :mrgreen:

Ja, ich hatte es schon genauso gelesen. (Ehrenwort!!)

Und hätte ich

Code: Alles auswählen

from funktion3 import *
probiert, dann hätte es auch gleich geklappt. :D

Danke für eure Erklärungen und leider wird das wohl nicht meine letzte blöde Frage bleiben, aber Leute, da müßen wir jetzt gemeinsam durch. :roll: :roll:

Und klar, es gibt keine Python bash, also völlig klar!

Sorry, jetzt echt. Obwohl ich wohl echt zu blöd zum Programmieren bin will ich es trotzdem lernen. Bin halt ein Einzelkind, total verwöhnt.

Und nochmal Danke!!!!! :wink:

Gruss,
Du weißt das du vergessen hast einzukaufen, wenn du dich morgens mit Geschirrspülmittel duscht.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sinnentlehrt hat geschrieben:Und hätte ich

Code: Alles auswählen

from funktion3 import *
probiert, dann hätte es auch gleich geklappt. :D
Ja, aber das wäre kein guter Programmierstil gewesen, daher ist es andersrum schon besser.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten