我很难理解python importlib库。我看到了两个动态导入模块的实现:
1.
spec = importlib.util.spec_from_file_location(name, path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
字符串
importlib.import_module(name)
型
哪一个是正确的?这里有什么不同呢?先谢了。
两者都有作用,都给予相同的结果。
1条答案
按热度按时间pxy2qtax1#
第一个代码段尝试从特定文件创建模块,该文件可能位于不在导入路径上的文件夹中。它将执行文件中的代码,而不管该代码是否已经执行,并且它将创建新的模块对象,即使先前已经为该文件创建了模块对象。它不会将模块插入
sys.modules
。如果您需要从导入路径以外的文件加载代码,此代码可能是一种实现此目的的方法。但是,如果该代码依赖于导入路径之外的其他代码,则该代码将无法找到这些依赖项,因此此代码可能不够。您还应该小心尝试两次加载同一个文件。
第二个代码片段只是以与通常的
import
语句相同的方式加载模块,使用sys.modules
和sys.path
等所有常规机制,但允许您指定要动态加载的模块的名称。import foo
和foo = importlib.import_module('foo')
基本上是等价的,但是importlib.import_module
允许您执行mod = importlib.import_module(some_name_computed_at_runtime)
。由于奇怪的实现细节,如果您导入一个带有
importlib.import_module
的包,importlib.import_module
也会初始化包的__all__
列表中命名的任何子模块。这通常不是什么大事。如果你的情况是“我会使用
import
,但我在写代码时还不知道模块名”,那么importlib.import_module
就是你要走的路。