从Python列表中导入模块

Six*_*ged 6 python import module list

我正在尝试从列表中导入模块。这将允许更轻松地编辑导入的模块,更清晰的错误消息以及更好的错误处理。这基本上是我想要做的:

imports = ['sys', 'itertools', 'datetime', 'os']
for x in imports:
    try:
        import x
        print "Successfully imported ", x, '.'
    except ImportError:
        print "Error importing ", x, '.'
Run Code Online (Sandbox Code Playgroud)

这里的问题是它尝试导入x,而不是应该包含的值x。我意识到要从列表中导入,可以执行以下操作,但是我看不到任何处理错误的方法:

imports = ['sys', 'itertools', 'datetime', 'os']
modules = map(__import__, imports)
Run Code Online (Sandbox Code Playgroud)

有没有办法将错误处理与此方法集成在一起,还是应该尝试其他方法?

iCo*_*dez 7

与其一次将它们映射到___import__所有模块,不如将每个模块一次附加到列表中modules的for循环中:

imports = ['sys', 'itertools', 'datetime', 'os']
modules = []
for x in imports:
    try:
        modules.append(__import__(x))
        print "Successfully imported ", x, '.'
    except ImportError:
        print "Error importing ", x, '.'
Run Code Online (Sandbox Code Playgroud)

但是请注意,大多数Python程序员更喜欢使用importlib.import_module而不是__import__此任务。


还要注意,制作modules字典而不是列表可能会更好:

imports = ['sys', 'itertools', 'datetime', 'os']
modules = {}
for x in imports:
    try:
        modules[x] = __import__(x)
        print "Successfully imported ", x, '.'
    except ImportError:
        print "Error importing ", x, '.'
Run Code Online (Sandbox Code Playgroud)

现在,而不是按索引:

modules[0].version
modules[3].path
Run Code Online (Sandbox Code Playgroud)

您可以按名称访问模块:

modules["sys"].version
modules["os"].path
Run Code Online (Sandbox Code Playgroud)