Problem mit inspect.getfunctions

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
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Ich rufe aus Skript A Functionen aus Script B auf. Nun kann es vorkommen, dass eine der Funktionen in Skript B eine andere Funktion aus Skript B aufrufen muss, welche ist variabel.
Daher dachte ich, hol ich mir die Funktionsnamen mit:

Code: Alles auswählen

inspect.getmembers(__main__,inspect.isfunction)
Das ganze mache ich in der entsprechenden Funktion in B.
Ich bekomme aber nur eine leere Liste zurück. Es gibt aber mehrere Funktionen.

Hab dann, das Skript B (da stehen wirklich NUR Funktionen drin. nichst außerhalb) in der WingIDE einfach mal ausgeführt und danach in der Shell die Funktionen, ausgeben lassen und ich bekomme eine korrekte Liste, mit allen Funktionen.

Woran liegt das?
Dachte dann, okay vielleicht liegt es daran, dass ich die Funktionen ja aus einer Funktionen abfrage und hab das inspect VOR alle Funktionen gesetzt und dann per Print ausgeben lassen .... das gleiche... ich bekomme eine leere Liste.
Bin etwas ratlos.
BlackJack

Wo kommt `__main__` her?
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

aus Skript B ... hab das da ganz normal importiert ....
BlackJack

`__main__` ist das Modul mit dem das Programm gestartet wurde. Hast Du das Programm denn mit Modul B gestartet? Von der Beschreibung ging ich davon aus, dass A das Modul ist, was Modul B importiert und Funktionen daraus benutzt. In dem Fall ist `__main__` das Modul A.

Nützlich bei solchen Sachen ist auch immer ein ``print __main__`` oder ``print dir(__main__)``, um zu sehen was `__main__` denn nun eigentlich ist und enthält.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

ah okay.... das heißt statt main, einfach Modul B angeben ... Hatte ich dann auch schon probiert ... hatte statt Main, den vollständigem Pfadnamen von B angegeben, die Liste blieb leer.



Das Programm gestartet wird ja dann wieder wo ganz anders her ... nicht mal aus Modul A, sondern sagen wir A0 ... über ne nette kleine Oberfläche, die dann A aufruft ....


Ich hab jetzt (ganz böse, ich weiß) einfach nen eval missbraucht um das Skript zum Laufen zu bringen... aber das kann es ja nicht sein :(
BlackJack

Wenn Du in einem Modul selber dessen Funktionen ermitteln willst (nach dem es vollständig importiert wurde!):

Code: Alles auswählen

import sys
import inspect

def get_functions():
    return inspect.getmembers(sys.modules[__name__], inspect.isfunction)

print get_functions()
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

ahhhhhhhhh ... so einfach ist das? :oops:

Wann schaff ich es mal selber genau zu wissen, wann ich aus welchem modul genau was brauche? Das wird zwar immer mehr... aber ... *seufz
*schäm*

JETZT funktioniert auch das prima und ich brauch kein garstiges eval mehr:

Code: Alles auswählen

for f in ifilter(lambda n: n[0] == dict_A[1] , get_functions()):
        ....
Danke. :?
Antworten