为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

LEATH 2019-06-01 14:24:37
如何导入给定名称的模块?我正在编写一个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()这很好,我只是想知道是否有一种更惯用的方法来完成我们使用这段代码所做的工作。请注意,我特别不想进入使用鸡蛋或扩展点。这不是一个开源项目,我不希望有“插件”。重点是简化主应用程序代码,并消除每次添加新命令模块时修改它的需要。
查看完整描述

4 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

在Python版本超过2.7/3.1的情况下,您几乎就是这样做的。

有关更新版本,请参见importlib.import_modulePython 2Python 3.

你可以用exec如果你也想的话。

或使用__import__您可以通过以下操作导入模块列表:

>>> moduleNames = ['sys', 'os', 're', 'unittest'] >>> moduleNames['sys', 'os', 're', 'unittest']>>> modules = map(__import__, moduleNames)

直接从深入Python.


查看完整回答
反对 回复 2019-06-01
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

注: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


查看完整回答
反对 回复 2019-06-01
  • 4 回答
  • 0 关注
  • 488 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信