Seite 1 von 1

alle gebrauchten module eines moduls listen

Verfasst: Mittwoch 5. Februar 2014, 23:53
von init-0
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?

Re: alle gebrauchten module eines moduls listen

Verfasst: Donnerstag 6. Februar 2014, 00:22
von pillmuncher
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!

Re: alle gebrauchten module eines moduls listen

Verfasst: Donnerstag 6. Februar 2014, 00:24
von snafu

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

Re: alle gebrauchten module eines moduls listen

Verfasst: Donnerstag 6. Februar 2014, 00:25
von Sirius3
@init-0: so wie Du das vorhast, funktioniert das überhaupt nicht. Schau Dir mal das ast-Modul an.

Re: alle gebrauchten module eines moduls listen

Verfasst: Donnerstag 6. Februar 2014, 00:53
von pillmuncher
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.

Re: alle gebrauchten module eines moduls listen

Verfasst: Donnerstag 6. Februar 2014, 01:51
von EyDu
Mal anders gefragt: Warum möchtest du überhaupt wissen, welche Module von einem Modul importiert werden?

Re: alle gebrauchten module eines moduls listen

Verfasst: Donnerstag 6. Februar 2014, 02:07
von DasIch
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.