请注意,相对导入是基于当前模块的名称进行导入的。由于主模块的名称总是 "__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官方文档-导入系统