当前位置:   article > 正文

Python中imporlib与imp导入模块的区别以及如何使用绝对路径和相对路径

Python中imporlib与imp导入模块的区别以及如何使用绝对路径和相对路径

importlib为imp模块衍生及拓展,它们都可以用于载入模块,并且具备reload的功能,但是在网上查阅大量资料显示最常用的importlib.import_module()只能已相对路径载入模块,现已找到一种使用importlib库以文件绝对路径载入模块的方法,下面分别对imp载入模块、importlib相对路径载入模块、importlib绝对路径载入模块的使用方法进行示例说明。

方法一、imp.load_module()

先使用imp.find_module()根据文件绝对路径找到需要载入的模块:

fp,path,descrip = imp.find_module('config_user',['/Desktop/Scripts'])
  • 1

fp相当于调用open()后返回的文件句柄,path的为文件完整路径:/Desktop/Scripts/config_user.py,descrip为一些描述值,然后调用imp.load_module()载入模块:

module = load_module('config_user', fp,path,descrip)
  • 1

此时模块载入完成,可以通过module.attribute或者module.func()的方式调用模块中的属性和方法,模块使用完毕后需要关闭fp:

if fp:
	fp.close()
  • 1
  • 2

方法二、importlib.import_module()

这种方法只能通过相对路径载入模块,与imp.find_module()的区别是:它无需先调用一个find函数,可以直接一步到位载入模块,缺点是它无法找到当前所在文件夹之外的文件,但是当前文件夹之内所有文件都能载入,无论中间嵌套了多少层,只要把相对路径写正确就行,使用方法为:

>>> import importlib
>>> module = importlib.import_module('del_test.test1.test1')
>>> module
<module 'del_test.test1.test1' from '/Scripts/del_test/test1/test1.py'>

  • 1
  • 2
  • 3
  • 4
  • 5

也可以使用

>>> module = importlib.import_module('.test1',package='test1')
>>> module
<module 'test1.test1' from '/Scripts/del_test/test1/test1.py'>

  • 1
  • 2
  • 3
  • 4

方法三、使用importlib以文件绝对路径载入模块

首先使用importlib.util.spec_from_file_location()获取模块的specification信息:

>>> spec = importlib.util.spec_from_file_location('np_test','/Desktop/Scripts/del_test/test1/test1.py')
>>> spec
ModuleSpec(name='np_test', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7f8fec3ccf28>, origin='/Desktop/Scripts/del_test/test1/test1.py')

  • 1
  • 2
  • 3
  • 4

其中的第一个参数np_test是你对于这个要载入模块的命名,载入的文件为test1.py。然后调用importlib.util.module_from_spec(spec)获取需要导入的模块,最后使用spec.loader.exec_module(foo)进行模块加载。

>>> foo = importlib.util.module_from_spec(spec)
>>> foo
<module 'np_test' from '/Desktop/Scripts/del_test/test1/test1.py'>
>>> spec.loader.exec_module(foo)
  • 1
  • 2
  • 3
  • 4

此时就可以使用test1.py文件中的所有类或者函数了:

>>> foo.np_test().num
10
>>> foo.np_test().cal_num(5)
7
  • 1
  • 2
  • 3
  • 4

综上,如果要使用绝对路径载入模块使用imp.load_module()最省事,如果要使用相对路径载入模块使用importlib.import_module()最省事,但是目前据我简单的使用来看,我不太能理解importlib比imp好在哪里,希望路过的大佬可以答疑解惑。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/272273
推荐阅读
相关标签
  

闽ICP备14008679号