Seite 1 von 1

Problem mit inspect.getfunctions

Verfasst: Freitag 22. Februar 2008, 08:52
von meneliel
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.

Verfasst: Freitag 22. Februar 2008, 09:49
von BlackJack
Wo kommt `__main__` her?

Verfasst: Freitag 22. Februar 2008, 09:54
von meneliel
aus Skript B ... hab das da ganz normal importiert ....

Verfasst: Freitag 22. Februar 2008, 10:14
von 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.

Verfasst: Freitag 22. Februar 2008, 10:29
von meneliel
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 :(

Verfasst: Freitag 22. Februar 2008, 10:37
von 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()

Verfasst: Freitag 22. Februar 2008, 11:00
von meneliel
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. :?