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'])

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

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

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

if fp:
	fp.close()

方法二、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'>

也可以使用

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

方法三、使用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')

其中的第一个参数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)

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

>>> foo.np_test().num
10
>>> foo.np_test().cal_num(5)
7

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

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值