ModuleNotFound:没有名为 'app' 的模块

ModuleNotFound: No module named 'app'

假设我有以下文件夹结构,用于在我的项目仓库中组织测试:

project/
    app.py
    tests/
        test.py

app.py有一个简单的加法函数:

def add(x, y):
    return x + y

test.py 测试这个函数:

from app import add
import unittest

class TestCase(unittest.TestCase):
    def test_add(self):
        print('Running the test!')
        self.assertEqual(add(3, 4), 7)

if __name__ == '__main__':
    unittest.main()

当我使用 nose2 时,一切正常:

mac:project $ nose2
Running the test!
Ran 1 test in 0.000s
Ok

问题是当我尝试直接 运行 test.py 时出现以下错误:

mac:project $ python tests/test.py
ModuleNotFound: No module named 'app'

我该如何解决这个问题?原因是我想使用 coverage 包来测量代码覆盖率,但我遇到了同样的错误:

mac:project $ coverage run tests/test.py
ModuleNotFound: No module named 'app'

我试过 from ..app import app 但我收到此错误:ValueError: attempted relative import beyond top-level package

当你运行python tests/test.py时,tests目录在Python路径上,但父目录不在,所以你无法导入应用程序。

您可以通过在 test.py 中的导入之前添加 project 目录来使导入工作:

import os, sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

感谢 Alasdair 的正确想法。我需要将以下内容添加到 test.py 的顶部以告诉 python 在 project 中查找导入:

import os, sys
parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(parent_dir)