如何导入给定名称的模块?

如何导入给定名称的模块?

我正在编写一个Python应用程序,它以命令作为参数,例如:

$ python myapp.py command1

我希望应用程序是可扩展的,也就是说,能够添加实现新命令的新模块,而不必更改主应用程序源代码。这棵树看起来像:

myapp/
    __init__.py
    commands/
        __init__.py
        command1.py
        command2.py
    foo.py
    bar.py

因此,我希望应用程序在运行时找到可用的命令模块,并执行适当的命令模块。

Python定义了进口函数,该函数接受模块名称的字符串:

_import_(名称,globals=无,局部变量=无,from list=(),level=0)

函数导入模块名,可能使用给定的全局和局部变量来确定如何在包上下文中解释该名称。FROM列表给出了应该根据名称从模块导入的对象或子模块的名称。

资料来源:https:/docs.python.org/3/Library/function s.html#进口

所以目前我有这样的事情:

command = sys.argv[1]try:
    command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"])except ImportError:
    # Display error messagecommand_module.run()

这很好,我只是想知道是否有一种更惯用的方法来完成我们使用这段代码所做的工作。

请注意,我特别不想进入使用鸡蛋或扩展点。这不是一个开源项目,我不希望有“插件”。重点是简化主应用程序代码,并消除每次添加新命令模块时修改它的需要。


LEATH
浏览 493回答 4
4回答

子衿沉夜

在Python版本超过2.7/3.1的情况下,您几乎就是这样做的。有关更新版本,请参见importlib.import_module为Python 2和Python 3.你可以用exec如果你也想的话。或使用__import__您可以通过以下操作导入模块列表:>>> moduleNames = ['sys', 'os', 're', 'unittest'] >>> moduleNames['sys', 'os', 're', 'unittest']>>> modules = map(__import__, moduleNames)直接从深入Python.

翻过高山走不出你

注:IMP因为Python3.4支持进口库如前所述,IMP模块为您提供加载功能:imp.load_source(name, path)imp.load_compiled(name, path)我以前用过这些来做类似的事情。在我的例子中,我用所需的方法定义了一个特定的类。加载模块后,我将检查类是否在模块中,然后创建该类的实例,如下所示:import impimport osdef load_from_file(filepath):     class_inst = None     expected_class = 'MyClass'     mod_name,file_ext = os.path.splitext(os.path.split(filepath)[-1])     if file_ext.lower() == '.py':         py_mod = imp.load_source(mod_name, filepath)     elif file_ext.lower() == '.pyc':         py_mod = imp.load_compiled(mod_name, filepath)     if hasattr(py_mod, expected_class):         class_inst = getattr(py_mod, expected_class)()     return class_inst
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python