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

时间:2017-12-07 22:11:48

标签: python testing directory-structure

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

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

2 个答案:

答案 0 :(得分:0)

运行python tests/test.py时,tests目录位于Python路径上,但父目录不在,因此您无法导入应用程序。

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

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

答案 1 :(得分:0)

感谢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)