Python关于import的实验(5) 相对导入和绝对导入

请注意,相对导入是基于当前模块的名称进行导入的。由于主模块的名称总是 "__main__" ,因此用作Python应用程序主模块的模块必须始终使用绝对导入。一言一概之,主模块内必须使用绝对导入,不可以使用相对导入. Note that relative imports are based on the name of the current module. Since the name of the main module is always "__main__", modules intended for use as the main module of a Python application must always use absolute imports.
相对导入使用前缀点号。 一个前缀点号表示相对导入从当前包开始。 两个或更多前缀点号表示对当前包的上级包的相对导入,第一个点号之后的每个点号代表一级。

添加代码: test4main.py

from sound.filters import test4cxq
# from sound.filters import test4cxq__

一个英文句点.表示当前模块(py文件)目录,两个句点..表示当前模块的父目录,三个句点...表示当前模块父目录的父目录,以此类推,四个句点、五个据点等等
绝对导入可以使用 import <> 或 from <> import <> 语法,但相对导入只能使用第二种形式;其中的原因在于:
import XXX.YYY.ZZZ
应当提供 XXX.YYY.ZZZ 作为可用表达式,但 .moduleY 不是一个有效的表达式。

添加代码: sound\filters\test4cxq.py

# import equalizer # 直接作为主程序使用 
# 这行代码作为主程序直接运行不出错,
# 但是作为子程序被test4main.py调用时会报错.
r'''
Traceback (most recent call last):
  File "c:\Users\chenxuqi\Desktop\新建文件夹\testImport\test4Main.py", line 1, in <module>
    from sound.filters import test4cxq
  File "c:\Users\chenxuqi\Desktop\新建文件夹\testImport\sound\filters\test4cxq.py", line 1, in <module>
    import equalizer
ModuleNotFoundError: No module named 'equalizer'
'''



from . import vocoder  # 不能直接作为主程序运行,只能被主程序test4main.py调用
print(vocoder.info,"\n\n\n")
r'''
这行代码也不能作为主程序运行,
只能作为子程序被调用.
否则会报错.
Traceback (most recent call last):
  File "c:\Users\chenxuqi\Desktop\新建文件夹\testImport\sound\filters\test4cxq.py", line 15, in <module>
    from . import vocoder  # 不能直接作为主程序运行,只能被主程序调用
ImportError: cannot import name 'vocoder' from '__main__' (c:\Users\chenxuqi\Desktop\ 
新建文件夹\testImport\sound\filters\test4cxq.py)
'''



from .equalizer import info # 不能直接作为主程序运行,只能被主程序test4main.py调用
print(info)
r'''
同样这行代码也不能作为主程序运行,
只能作为子程序被调用.
否则会报错.
Traceback (most recent call last):
  File "c:\Users\chenxuqi\Desktop\新建文件夹\testImport\sound\filters\test4cxq.py", line 30, in <module>
    from .equalizer import info # 不能直接作为主程序运行,只能被主程序调用
ModuleNotFoundError: No module named '__main__.equalizer'; '__main__' is not a package
PS C:\Users\chenxuqi\Desktop\新建文件夹\testImport> 
'''







# import karaoke1111 # 这行代码是用来测试导入不存在的模块的情况的
r'''
报错信息如下:
  File "c:\Users\chenxuqi\Desktop\新建文件夹\testImport\sound\filters\test4cxq.py", line 49, in <module>
    import karaoke1111
ModuleNotFoundError: No module named 'karaoke1111'
'''





from . import karaoke # 不能直接作为主程序运行,只能被主程序test4main.py调用
print(karaoke.info,"\n\n\n")
r'''
同样这行代码也不能作为主程序运行,
只能作为子程序被调用.
否则会报错.
Traceback (most recent call last):
  File "c:\Users\chenxuqi\Desktop\新建文件夹\testImport\sound\filters\test4cxq.py", line 61, in <module>
    from . import karaoke # 不能直接作为主程序运行,只能被主程序调用
ImportError: cannot import name 'karaoke' from '__main__' (c:\Users\chenxuqi\Desktop\ 
新建文件夹\testImport\sound\filters\test4cxq.py)
'''



from ..filters import myFilters  # 不能直接作为主程序运行,只能被主程序test4main.py调用
print(myFilters.info,"\n\n\n")
r'''
同样这行代码也不能作为主程序运行,
只能作为子程序被调用.
否则会报错.
Traceback (most recent call last):
  File "c:\Users\chenxuqi\Desktop\新建文件夹\testImport\sound\filters\test4cxq.py", line 76, in <module>
    from ..filters import myFilters  # 不能直接作为主程序运行,只能被主程序调用        
ValueError: attempted relative import beyond top-level package
'''





from ..effects import echo # 不能直接作为主程序运行,只能被主程序test4main.py调用
print(echo.info,"\n\n\n")
r'''
同样这行代码也不能作为主程序运行,
只能作为子程序被调用.
否则会报错.
Traceback (most recent call last):
  File "c:\Users\chenxuqi\Desktop\新建文件夹\testImport\sound\filters\test4cxq.py", line 81, in <module>
    from ..effects import echo # 不能直接作为主程序运行,只能被主程序调用
ValueError: attempted relative import beyond top-level package
'''



from ..formats.aiffread import info # 不能直接作为主程序运行,只能被主程序test4main.py调用
print(info,"\n\n\n")
r'''
同样这行代码也不能作为主程序运行,
只能作为子程序被调用.
否则会报错.
Traceback (most recent call last):
  File "c:\Users\chenxuqi\Desktop\新建文件夹\testImport\sound\filters\test4cxq.py", line 95, in <module>
    from ..formats.aiffread import info # 不能直接作为主程序运行,只能被主程序调用     
ValueError: attempted relative import beyond top-level package
'''


print("\n\n\n\n测试绝对导入...")
# 绝对导入
# import sound.effects.surround 
import sound.effects.surround as snd
print(snd.info)

# from sound.effects import reverse
from sound.effects import reverse as rvs
print(rvs.info)

cmd控制台下的输出:

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

PS C:\Users\chenxuqi\Desktop\新建文件夹\testImport>  & 'D:\Python\Python37\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2020.11.367453362\pythonFiles\lib\python\debugpy\launcher' '63515' '--' 'c:\Users\chenxuqi\Desktop\新建文件夹\testImport\test4main.py'
初始化...我是__init__文件:sound\__init__.py
我是文件:sound\filters\__init__.py
我是sound\filters\vocoder.py 



我是sound\filters\equalizer.py
我是sound\filters\karaoke.py 



我是sound\filters\myFilters.py 



我是文件:sound\effects\__init__.py
我是sound\effects\echo.py 



我是文件:sound\formats\__init__.py
我是sound\formats\aiffread.py 







测试绝对导入...
我是sound\effects\surround.py
我是sound\effects\reverse.py
PS C:\Users\chenxuqi\Desktop\新建文件夹\testImport> 
PS C:\Users\chenxuqi\Desktop\新建文件夹\testImport> 
PS C:\Users\chenxuqi\Desktop\新建文件夹\testImport> 

配套源代码: 源代码及相关文件下载
参考链接: Python官方文档-模块
参考链接: Python官方文档-导入系统

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值