You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python包运行与单元测试无法同时正常工作问题咨询

解决Python模块导入兼容问题

问题根源

两种场景的冲突本质是Python模块搜索路径(sys.path)的差异:

  • 场景1:直接运行calculator.py时,脚本所在的library目录会被自动加入sys.path,因此能直接导入同目录的模块;但运行单元测试时,当前工作目录是project,sys.path中没有library目录,导致找不到time_calculator。
  • 场景2:使用绝对导入from library.time_calculator import...时,单元测试运行时project在sys.path中,library作为子包可被找到;但直接运行calculator.py时,工作目录是library,sys.path中没有project,因此无法识别library包。

三种可行解决方案

方案一:使用相对导入 + 模块方式运行(规范做法)

  1. 修改calculator.py中的导入语句为相对导入:
    from .time_calculator import TimeCalculator
    from .distance_calculator import DistanceCalculator
    # 其他同目录模块同理
    
  2. 调整运行方式:
    • 运行calculator.py:切换到project目录,执行python -m library.calculator(以模块形式运行,而非直接执行脚本)
    • 运行单元测试:同样在project目录执行python -m unittest library.tests.unittests_calculator,或用自动发现命令python -m unittest discover library/tests

方案二:临时修改sys.path(快速调试)

在calculator.py开头添加代码,将project目录手动加入sys.path,确保两种场景下都能找到模块:

import sys
import os
# 获取当前脚本的父目录的父目录(即project目录)
project_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if project_dir not in sys.path:
    sys.path.append(project_dir)

之后calculator.py中可继续使用绝对导入from library.time_calculator import...,直接运行脚本和单元测试都能正常工作。

方案三:将项目转为可安装包(长期维护推荐)

  1. 在project目录下创建setup.py文件:
    from setuptools import setup, find_packages
    
    setup(
        name="calculator-library",
        version="0.1.0",
        packages=find_packages(),
    )
    
  2. 以开发模式安装包:切换到project目录,执行pip install -e .
    安装完成后,无论在哪个目录运行脚本或测试,都能直接使用from library.time_calculator import...的绝对导入,彻底解决路径问题。

内容的提问来源于stack exchange,提问作者wafers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 07:00:01