Skip to content

同级文件导入解决方案

复制本地路径 | 在线编辑

当前问题

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

推荐方案:相对导入

需要修改的导入

  1. 同级文件(在 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
    

  2. 上级目录的文件(在 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  # 父目录


注意事项

  1. 相对导入只能在包内使用
  2. run_capture.py 是入口文件,不能使用相对导入
  3. 只能使用绝对导入:from tools.capture.main import main

  4. 需要 __init__.py

  5. tools/__init__.py ✅(已创建)
  6. tools/capture/__init__.py ❌(需要创建)

  7. 如果 window_2.py 中有相对导入

  8. 也需要相应调整

Comments