alle gebrauchten module eines moduls listen

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
init-0
User
Beiträge: 38
Registriert: Samstag 22. Januar 2011, 18:46

Hallo,

ich würde gerne alle module auflisten die ein anderes modul benötigt.
Mein bisheriger Code ist:

Code: Alles auswählen

for name in dir(m):  #__import__(m)
        print(name)
        val = getattr(m, name)
        if isinstance(val, types.ModuleType) and hasattr(val, "__file__"):
            yield val.__name__, val.__file__
Das Problem dabei ist, dass dinge die durch

Code: Alles auswählen

from blah import x
dadurch nicht angezeigt werden.
Hat jemand Vorschläge wie das besser gehen kann?
Ich hab mir überlegt so über die module zu iterieren, aber leider werden die o.g. module auch nicht angezeit:

Code: Alles auswählen

m.__builtins__["__import__"]("sys").modules
Hat jemand Vorschläge?
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Zuerst:

Code: Alles auswählen

# file: m.py
def foo():
    import pprint, string
    pprint.pprint([
        list(string.lowercase)[:10],
        list(string.uppercase)[:10],
        list(string.digits)])
Und dann:

Code: Alles auswählen

>>> import m, types
>>>
>>> m.foo()
[['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'],
 ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
 ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']]
>>>
>>> for name in dir(m):
...     print(name)
...     val = getattr(m, name)
...     if isinstance(val, types.ModuleType) and hasattr(val, "__file__"):
...         print val.__name__, val.__file__
...
__builtins__
__doc__
__file__
__name__
__package__
foo
Oops!
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

import inspect

def get_modules(module):
    modules = set()
    for name in dir(module):
        obj = getattr(module, name)
        mod = inspect.getmodule(obj)
        if mod is not None and mod is not module:
            modules.add(mod)
    return modules
Zuletzt geändert von snafu am Donnerstag 6. Februar 2014, 00:34, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@init-0: so wie Du das vorhast, funktioniert das überhaupt nicht. Schau Dir mal das ast-Modul an.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Das noch:

Code: Alles auswählen

>>> mm = [getattr(__builtins__, '__tropmi__'[::-1])('M'.lower())]
>>> mm
[<module 'm' from 'm.pyc'>]
>>> mm.pop().foo()
[['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'],
 ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
 ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']]
Und das:

Code: Alles auswählen

>>> import m
>>> class M(type(m)):
...     def bar(self):
...         print 'hello!'
...
>>> M('M')
<module 'M' (built-in)>
>>> M('M').bar()
hello!
Wer mal 3h Zeit hat, sollte sich in dem Zusammenhang diesen Vortrag von David Beazley anschauen. Über Modulimport spricht er ab 2:02:31.
In specifications, Murphy's Law supersedes Ohm's.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mal anders gefragt: Warum möchtest du überhaupt wissen, welche Module von einem Modul importiert werden?
Das Leben ist wie ein Tennisball.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du kannst bestenfalls die Namen der Abhängigkeiten bestimmen, identifizieren kann man die statisch nicht da zur Laufzeit z.B. sys.path verändert werden könnte.
Antworten