2017-06-12 19 views
8

Wie diskutiert here, können wir ein Modul dynamisch mit Stringvariable importieren.Python dynamischer Import - wie man * aus Modulname aus Variable importiert?

import importlib 
importlib.import_module('os.path') 

Meine Frage ist, wie man import * von String-Variable?

arbeiten Manche Dinge wie diese nicht jetzt

importlib.import_module('os.path.*') 
+1

Warum versuchen Sie dies zu tun? '*' - Importe sind im Allgemeinen verpönt, sie überfluten den Namespace und Sie können Dinge importieren, die Sie nicht beabsichtigt haben (z. B. ein Modul wird aktualisiert, erhält eine neue Funktion, die einen früheren Import außer Kraft setzt). Haben Sie einen konkreten Anwendungsfall, um dies dynamisch zu tun? – mata

+0

Ich weiß mit 'Import *' Sound gefährlich; obwohl es für den einfachen Anwendungsfall funktioniert. Mein konkreter Anwendungsfall ist, dass ich versuche, 'Proboscis' zu verwenden, um' Python-Test' auszuführen, die es mir ermöglichen, den zu testenden Testanzug auszuwählen - der gewählte Testanzug wird durch eine Reihe von Testdateinamen definiert. –

Antwort

14

Sie können die folgenden Trick:

>>> import importlib 
>>> globals().update(importlib.import_module('math').__dict__) 
>>> sin 
<built-in function sin> 

gewarnt werden, dass alle Namen in dem Modul vor Ort zur Verfügung stellt, so dass es etwas anders als *, weil es nicht mit __all__ so für zB beginnt Es überschreibt auch __name__, __package__, __loader__, __doc__.

Update:

Hier ist eine genauere und sicherere Version als @mata in comments wies darauf hin:

module = importlib.import_module('math') 

globals().update(
    {n: getattr(module, n) for n in module.__all__} if hasattr(module, '__all__') 
    else 
    {k: v for (k, v) in module.__dict__.items() if not k.startswith('_') 
}) 

Besonderer Dank geht an Nam G VU für die Unterstützung an die Antwort mehr komplett.

+0

Ich verstehe nicht, was du meinst mit 'es ist etwas anders als * weil es nicht mit __all__' beginnt - was ist ** es ** hier? –

+2

Dies importiert auch Dinge wie "__name__", "__package__", "__loader__", "__doc__" usw., die Sie definitiv nicht importieren wollen. – mata

+5

mehr als eine Sünde – hurturk

Verwandte Themen