当前位置: 首页 > 面试题库 >

Python-如何导入给定名称的模块为字符串?

章越
2023-03-14
问题内容

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

$ python myapp.py command1

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

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

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

Python定义了__import__函数,该函数使用一个字符串作为模块名称:

__import __(name,globals = None,locals = None,fromlist =(),level = 0)

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

来源:https : //docs.python.org/3/library/functions.html# import

所以目前我有类似的东西:

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

command_module.run()

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

请注意,我特别不想使用鸡蛋或延伸点。这不是一个开源项目,我不希望有“插件”。关键是简化主应用程序代码,并且每次添加新命令模块时都无需对其进行修改。


问题答案:

对于2.7/3.1版本以上的Python,这基本上就是这样做的。
有关较新版本,请参见importlib.import_module For Python 2和Python 3。
如果你愿意,也可以使用exec。
或者使用“导入”可以通过执行以下操作导入模块列表:


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


 类似资料:
  • 问题内容: 给定Python模块的完整路径,如何加载它?注意,该文件可以位于文件系统中的任何位置,因为它是一个配置选项。 问题答案: 对于Python 3.5+,请使用: 对于Python 3.3和3.4,请使用: (尽管在Python 3.4中已弃用此功能。) 对于Python 2,请使用: 编译后的Python文件和DLL具有等效的便捷功能。

  • 问题内容: 我想导入foo-bar.py。这有效: 这不是: 我的问题:有什么方法可以使用上述格式,即导入其中包含的模块? 问题答案: 你不能。 不是标识符。将文件重命名为 编辑: 如果不是您的目标(例如:您不在乎会发生什么,您不需要导入自身),只需将文件的所有全局变量都放入自己的作用域中,就可以使用

  • 问题 你想导入一个模块,但是模块的名字在字符串里。你想对字符串调用导入命令。 解决方案 使用importlib.import_module()函数来手动导入名字为字符串给出的一个模块或者包的一部分。举个例子: >>> import importlib >>> math = importlib.import_module('math') >>> math.sin(2) 0.9092974268256

  • 问题内容: 这是我的代码: 有什么帮助吗? 问题答案: 如urllib2文档中所述: 该模块已在Python 3中分为几个名为和的模块。2to3在将源转换为Python 3时,该工具将自动调整导入。 所以你应该说 你当前正在编辑的代码示例不正确,因为你在说urllib.urlopen("http://www.google.com/”)而不是urlopen("http://www.google.co

  • 问题内容: 在Python程序中,给定带有函数名称的字符串的最佳方法是什么。例如,假设我有一个模块,我有一个内容为的字符串。最好的通话方式是什么? 我需要获取函数的返回值,这就是为什么我不只是使用。我想出了如何通过使用eval定义一个返回该函数调用结果的函数来执行此操作的方法,但是我希望有一种更优雅的方法来执行此操作。 问题答案: 假设模块与方法: 你可以将第2行和第3行缩短为: 如果这对你的用例

  • 问题内容: 给定完整路径,如何加载Python模块?请注意,该文件可以在文件系统中的任何位置,因为它是配置选项。 问题答案: 对于Python 3.5+,请使用: 对于Python 3.3和3.4,请使用: (尽管在Python 3.4中已弃用此功能。) 对于Python 2,请使用: 编译后的Python文件和DLL具有等效的便捷功能。