Python标准项目结构下模块导入及单元测试失败求助
我完全懂你这种折腾半天导入还搞不定的崩溃感!咱们一步步把这个问题拆解开,先把项目结构理清楚,再逐个解决导入的问题。
首先先明确你的正确项目结构(结合你描述的内容补全):
Project/ ├── LICENSE.txt ├── README.txt ├── code/ │ ├── __init__.py │ ├── bidon.py │ └── main.py └── tests/ ├── context.py └── test_bidon.py
第一步:修复context.py的导入逻辑
你之前的导入失败,核心原因是Python默认不会把项目根目录加入模块搜索路径——tests和code是同级目录,直接在context.py里导入code会找不到这个包。我们需要手动把项目根目录加入搜索路径,再导入code。
替换context.py的内容为:
import sys import os # 获取项目根目录(tests目录的上级目录) sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) # 现在就能正常导入code包了 import code
这段代码的作用是把Project目录(也就是tests的父目录)添加到Python的模块搜索路径里,这样Python就能识别到code这个包。
第二步:修复test_bidon.py的问题
你之前的测试代码有几个明显的问题:拼写错误、函数引用错误、相对导入的坑,我们一一修正:
替换test_bidon.py的内容为:
import unittest from context import code # 通过context.py导入code包 class TestBidon(unittest.TestCase): def test_add(self): # 正确引用bidon里的add函数 result = code.bidon.add(10, 5) self.assertEqual(result, 15) if __name__ == "__main__": # 注意这里之前拼写错了,是__main__不是__main___ unittest.main()
额外的优化与注意事项
推荐的测试运行方式:从项目根目录(
Project/)运行测试,用命令:python -m tests.test_bidon这种方式会自动把项目根目录加入模块路径,即使不依赖
context.py也能正常运行(当然保留context.py对团队协作更友好)。检查拼写错误:你之前的导入语句里出现过
from code import bidion(应该是bidon),这种低级拼写错误也会导致导入失败,一定要仔细核对。确保
__init__.py存在:code目录下的__init__.py是Python识别该目录为包的标志,你的结构里已经有了,这点没问题。避免命名冲突:不要在项目根目录创建和模块同名的文件(比如
code.py或bidon.py),否则会覆盖你要导入的包。
按照上面的步骤调整后,你的导入和单元测试应该就能正常运行了!
内容的提问来源于stack exchange,提问作者user8584384

