2017-06-12 36 views
8

Jak omówiono here, możemy dynamicznie importować moduł za pomocą zmiennej łańcuchowej.Dynamiczny import Pythona - jak zaimportować * z nazwy modułu ze zmiennej?

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

Moje pytanie brzmi: jak import * od zmiennej łańcuchowej?

Niektóre rzeczy tak nie działa na razie

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

Dlaczego próbujesz to zrobić? '' '-imports są generalnie mile widziane, zajmują przestrzeń nazw i możesz w końcu importować rzeczy, których nie masz zamiaru (np. moduł jest aktualizowany, otrzymuje nową funkcję, która przesłania wcześniejszy import). Czy masz konkretny przypadek, aby robić to dynamicznie? – mata

+0

Wiem, że używanie 'importu'' brzmi niebezpiecznie; choć działa to w przypadku prostego użycia. Moim konkretnym przypadkiem jest to, że próbuję użyć 'proboscis' do uruchomienia' testu Pythona', który pozwala mi wybrać, który kombinezon testowy ma zostać uruchomiony - wybrany kolor testowy jest zdefiniowany przez tablicę testowych nazw plików. –

Odpowiedz

14

można zrobić następujące trick:

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

ostrzegamy sprawia, że ​​wszystkie nazwy w module dostępnych lokalnie, więc jest to nieco inna niż *, ponieważ nie rozpoczyna się od __all__, więc np. Zastąpi on także: __name__, __package__, __loader__, .

Aktualizacja:

Oto dokładniejsze i bezpieczniejsze wersja jak @mata wskazał w comments:

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('_') 
}) 

Szczególne podziękowania Nam G VU za pomoc w stworzeniu odpowiedź pełniejsze.

+0

Nie rozumiem, co masz na myśli, ponieważ jest nieco inny niż *, ponieważ nie zaczyna się od __all__' - co to jest ** tutaj **? –

+2

Spowoduje to również zaimportowanie rzeczy takich jak '__name__',' __package__', '__loader__',' __doc__' itd., Których na pewno nie chcesz importować. – mata

+5

więcej niż jeden grzech – hurturk