Ste*_*ehl 23 python import python-module
我有一个Python模块,我想动态导入只给出一个模块名称的字符串.通常我使用importlib
或者__import__
这很好用,因为我知道我想从模块导入哪些对象,但是有没有办法import *
动态地做同样的事情.还是有更好的方法?
我一般都知道使用它的不良做法,import *
但我试图导入的模块是动态自动生成的,我无法知道包含我正在寻址的类的确切模块.
谢谢.
war*_*iuc 26
使用update
的类型的字典:
globals().update(importlib.import_module('some.package').__dict__)
Run Code Online (Sandbox Code Playgroud)
请注意,使用a_module.__dict__
不一样from a_module import *
,因为所有名称都是"导入"的,不仅是那些来自__all__
或不是以_
.
我提出了一些丑陋的hacky代码,它适用于python 2.6.我不确定这是否是最聪明的事情,也许这里的其他人也有一些见解:
test = __import__('os',globals(),locals())
for k in dir(test):
globals()[k] = test.__dict__[k]
Run Code Online (Sandbox Code Playgroud)
您可能希望在此处检查以确保您不会覆盖全局命名空间中的任何内容.您可以避免全局部分,只需查看每个动态导入的模块,以获得您感兴趣的类.这可能比使用您导入的所有内容污染全局命名空间要好得多.
例如,假设您的类名为来自urllib2的请求
test = __import__('urllib2',globals(),locals())
cls = None
if 'Request' in dir(test):
cls = test.__dict__['Request']
# you found the class now you can use it!
cls('http://test.com')
Run Code Online (Sandbox Code Playgroud)