同级文件导入解决方案
复制本地路径 | 在线编辑
当前问题
capture/main.py 中:
import window_2 # ❌ 找不到
import captureThread0 # ❌ 找不到
import captureThread1 # ❌ 找不到
import settings # ❌ 找不到(在 tools/ 下)
from infoWin import InfoWin # ❌ 找不到
from configParser import ConfigParser # ❌ 找不到(在 tools/ 下)
原因:
main.py现在在包内(tools.capture)- Python 无法直接找到同目录的模块
- 需要使用相对导入或绝对导入
解决方案
方案 1:使用相对导入(推荐)⭐
优点:
- ✅ 明确表示它们在同一个包下
- ✅ 不依赖
sys.path - ✅ 更符合 Python 包的设计理念
个人记录: 没错,在子目录下依然建立 __init__.py 文件,总之把所有目录都当成包来看待。
修改方式:
# capture/main.py
# 同级文件(在 capture/ 目录下)
from . import window_2
from . import captureThread0
from . import captureThread1
from . import infoWin
from .infoWin import InfoWin
# 上级目录的文件(在 tools/ 目录下)
from ..settings import CONFIGS_DIR
from ..configParser import ConfigParser
要求:
- 需要创建
capture/__init__.py(让capture成为一个包)
方案 2:使用绝对导入
优点:
- ✅ 简单直接
修改方式:
# capture/main.py
# 同级文件
from tools.capture import window_2
from tools.capture import captureThread0
from tools.capture import captureThread1
from tools.capture.infoWin import InfoWin
# 上级目录的文件
from tools.settings import CONFIGS_DIR
from tools.configParser import ConfigParser
推荐方案:相对导入
需要修改的导入
-
同级文件(在
capture/目录下):
# 修改前 import window_2 import captureThread0 import captureThread1 from infoWin import InfoWin # 修改后 from . import window_2 from . import captureThread0 from . import captureThread1 from .infoWin import InfoWin -
上级目录的文件(在
tools/目录下):
# 修改前 import settings from configParser import ConfigParser # 修改后 from ..settings import CONFIGS_DIR from ..configParser import ConfigParser
需要创建的文件
创建 capture/__init__.py:
# capture/__init__.py
# 可以是空文件,或者添加包的说明
相对导入的语法
.= 当前包(capture)..= 父包(tools)...= 祖父包(如果有的话)
示例:
from . import window_2 # 同目录
from .window_2 import Ui_Form # 同目录的模块
from ..settings import BASE_DIR # 父目录
from ..configParser import ConfigParser # 父目录
注意事项
- 相对导入只能在包内使用
run_capture.py是入口文件,不能使用相对导入-
只能使用绝对导入:
from tools.capture.main import main -
需要
__init__.py tools/__init__.py✅(已创建)-
tools/capture/__init__.py❌(需要创建) -
如果
window_2.py中有相对导入 - 也需要相应调整