python-3.x 使用importlib

snz8szmq  于 2023-08-08  发布在  Python
关注(0)|答案(1)|浏览(122)

我很难理解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)


哪一个是正确的?这里有什么不同呢?先谢了。
两者都有作用,都给予相同的结果。

pxy2qtax

pxy2qtax1#

第一个代码段尝试从特定文件创建模块,该文件可能位于不在导入路径上的文件夹中。它将执行文件中的代码,而不管该代码是否已经执行,并且它将创建新的模块对象,即使先前已经为该文件创建了模块对象。它不会将模块插入sys.modules
如果您需要从导入路径以外的文件加载代码,此代码可能是一种实现此目的的方法。但是,如果该代码依赖于导入路径之外的其他代码,则该代码将无法找到这些依赖项,因此此代码可能不够。您还应该小心尝试两次加载同一个文件。
第二个代码片段只是以与通常的import语句相同的方式加载模块,使用sys.modulessys.path等所有常规机制,但允许您指定要动态加载的模块的名称。import foofoo = 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就是你要走的路。

相关问题