python '__import__' wie 'import'?



  • hallo! ich versuche gerade herauszufinden, wie ich in python __import__(modul) so aufrufe, dass das ergebnis dem gleichen enspricht, was ich mit import modul erhalten würde.

    beispiel:

    >>> __import__("textwrap")
    <module 'textwrap' from 'D:\Python25\lib\textwrap.pyc'>
    >>> textwrap.wrap("niemand erwartet die spanische inquisition", 11)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'textwrap' is not defined
    >>>
    

    vs.

    >>> import textwrap
    >>> textwrap.wrap("niemand erwartet die spanische inquisition", 11)
    ['niemand', 'erwartet', 'die', 'spanische', 'inquisition']
    >>>
    

    ich nehme an, dass import das modul in den globalen namensraum einblendet, __import__ das aber nicht tut.
    ich habe mir die dokumentation von __import__ angeschaut, fand dort aber nichts, was mir weiterhilft.

    hintergrund ist, dass ich einen plugin-mechanismus implementieren möchte, der automatisch alle vorhandenen module aus einem verzeichnis lädt.



  • __import__ gibt ein Modul-Objekt zurück. Folgendes sollte funktionieren:

    >>> textwrap = __import__("textwrap")
    >>> textwrap.wrap("hallo welt ich bin ein string", 5)
    ['hallo', 'welt', 'ich', 'bin', 'ein s', 'tring']
    


  • Xantus schrieb:

    __import__ gibt ein Modul-Objekt zurück. Folgendes sollte funktionieren:

    >>> textwrap = __import__("textwrap")
    >>> textwrap.wrap("hallo welt ich bin ein string", 5)
    ['hallo', 'welt', 'ich', 'bin', 'ein s', 'tring']
    

    schon, aber wenn ich schon vorher weiß wie das modul heißt, dann kann ich auch gleich import nehmen.
    das modul weiß doch selbst wie es heißt und unter diesem namen soll es dann auch global ansprechbar sein.



  • ich erklärs mal genauer. ich scanne ein verzeichnis nach unterverzeichnissen ab und versuche jedes unterverzeichnis als modul zu importieren. ganz grob gesagt so:

    for dir in os.listdir("/mein/programm/plugins"):
    ...
        module = __import__(dir, globals(), locals(), [])
    ...
    

    das funktioniert auch, ich kann über module.MeinPlugin das plugin ansprechen. ich möchte es aber lieber global als dir.MeinPlugin ansprechen, was ja auch sein "natürlicher" name ist.

    kann ich die rückgabe von __import__ zu einer globalen variable mit einem bestimmten namen machen? wie?


Anmelden zum Antworten