【问题标题】:importing a module when the module name is in a variable [duplicate]当模块名称在变量中时导入模块[重复]
【发布时间】:2012-11-15 21:19:46
【问题描述】:

可能重复:
Dynamic module import in Python

我正在编写一个小脚本,它从目录中获取文件名并将其传递给另一个模块,然后再导入该文件。

所以流程就像 1)获取模块名称(将其存储在变量中) 2)将此变量名称传递给模块 3)导入名称存储在变量名中的模块

我的代码是这样的

data_files = [x[2] for x in os.walk(os.path.dirname(sys.argv[0]))]
hello = data_files[0]
modulename = hello[0].split(".")[0]

import modulename

问题是当它到达 import 语句时,它将 modulename 读取为真正的模块名称,而不是存储在此变量中的值。我不确定这在 python 中是如何工作的,解决这个问题的任何帮助都会很棒

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    你想要内置的__import__函数

    new_module = __import__(modulename)
    

    【讨论】:

    • 你写的代码运行后,new_module中存储了什么?是我现在引用modulename的方式,就像np在运行import numpy as np之后引用numpy一样?
    • 我也有同样的问题。假设 new_module 是一个包(在文件夹 modulename 中)并且里面有文件 foo.py。我不认为你可以调用 new_module.foo.somefunction(),它会说没有模块 foo。
    • IIRC,我认为foo = __import__('foo')应该等同于import foobar = __import__('foo')` 与import foo as bar 等相同。如果您正在使用包,将照常导入包的__init__.py。例如__import__('numpy').core 为您提供 numpy 核心子包,因为 numpy 的 __init__.py 导入 numpy.core
    • 当我导入一个子模块时,我仍然需要使用完整路径来访问它——所以它对我来说还不够好。例如。 m = __import__("a.b.c"),然后我需要将 c 引用为 m.b.c.
    【解决方案2】:

    importlib 可能是要走的路。它的文档是here。对于most uses.,它通常优于__import__

    在你的情况下,你会使用:

    import importlib
    module = importlib.import_module(module_name, package=None)
    

    【讨论】:

    • 如果您不知道模块.py 文件的路径,请使用imp.load_source(..) from the imp module
    • 如何使用此选项进行 from 导入并进行多项选择。喜欢from configparser import ConfigParser, NoSectionError?还有from foo import *?
    • @576i 如果您已将 configparser 作为模块导入,则可以使用 ConfigParser = configparser.ConfigParser 等提供名称。 import * 是恶作剧,我不会鼓励它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    相关资源
    最近更新 更多