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)
假设我有以下文件夹结构,用于在我的项目仓库中组织测试:
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)