Python import statement. ModuleNotFoundError: when running tests and referencing a module in a parent folder
Python import statement. ModuleNotFoundError: when running tests and referencing a module in a parent folder
问题:如何修复测试文件中的导入语句?
============================================= ===
我运行以下命令:
命令 运行 启动测试
cd cluster_health
python -m pytest tests/ -v -s
然后我得到以下错误!
ImportError while importing test module '<full path>...\cluster_health\tests\unit\test_handler.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests\unit\test_handler.py:5: in <module>
from health_check import app
health_check\app.py:3: in <module>
import my_elastic_search
E ModuleNotFoundError: No module named 'my_elastic_search'
.\cluster_health\tests\unit\test_handler.py
import json
import sys
import pytest
import health_check
from health_check import app
from health_check import my_elastic_search
# from unittest.mock import patch
import mock
from mock import Mock
def test_lambda_handler(apigw_event, monkeypatch):
CONN = Mock(return_value="banana")
monkeypatch.setattr('health_check.my_elastic_search.connect', CONN)
ret = app.lambda_handler(apigw_event, "")
# etc...
.\cluster_health\health_check\app.py
import json
import sys
import my_elastic_search
def lambda_handler(event, context):
print(my_elastic_search.connect("myhost", "myuser", "mypass"))
# etc
.\cluster_health\health_check\my_elastic_search.py
def connect(the_host, the_user, the_pass):
return "You are connected!"
health_check 是文件夹的名称。在 Python 中导入时,您没有命名文件夹。您只需使用 import my_elastic_search
。但是,这可能会导致找不到模块。您可以使用名为 'sys' 的模块来定义程序应该在何处搜索正在导入的模块,或者您可以将代码放在与模块相同的目录中。
从文件导入特定函数时,您将使用 from
或从文件导入 class。
感谢 importing modules from parent folder 和@woofless(以上)这是我对问题的解决方案(问题陈述实际上是我在父目录中引用模块。AWS 工具包的脚手架 Visual Studio 与 SAM 不提供适当的代码来充分引用其他父模块)!
注意下面的sys.path.insert。此外,根据@woofless,我简化了名称空间引用,使其不引用根文件夹 "health_check"。瞧!
.\cluster_health\tests\unit\test_handler.py
import sys, os, inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
parentdir = "%s\health_check"%os.path.dirname(parentdir)
sys.path.insert(0,parentdir)
print(parentdir)
import json
import pytest
import health_check
import app
import my_elastic_search
问题:如何修复测试文件中的导入语句?
============================================= ===
我运行以下命令:
命令 运行 启动测试
cd cluster_health
python -m pytest tests/ -v -s
然后我得到以下错误!
ImportError while importing test module '<full path>...\cluster_health\tests\unit\test_handler.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests\unit\test_handler.py:5: in <module>
from health_check import app
health_check\app.py:3: in <module>
import my_elastic_search
E ModuleNotFoundError: No module named 'my_elastic_search'
.\cluster_health\tests\unit\test_handler.py
import json
import sys
import pytest
import health_check
from health_check import app
from health_check import my_elastic_search
# from unittest.mock import patch
import mock
from mock import Mock
def test_lambda_handler(apigw_event, monkeypatch):
CONN = Mock(return_value="banana")
monkeypatch.setattr('health_check.my_elastic_search.connect', CONN)
ret = app.lambda_handler(apigw_event, "")
# etc...
.\cluster_health\health_check\app.py
import json
import sys
import my_elastic_search
def lambda_handler(event, context):
print(my_elastic_search.connect("myhost", "myuser", "mypass"))
# etc
.\cluster_health\health_check\my_elastic_search.py
def connect(the_host, the_user, the_pass):
return "You are connected!"
health_check 是文件夹的名称。在 Python 中导入时,您没有命名文件夹。您只需使用 import my_elastic_search
。但是,这可能会导致找不到模块。您可以使用名为 'sys' 的模块来定义程序应该在何处搜索正在导入的模块,或者您可以将代码放在与模块相同的目录中。
从文件导入特定函数时,您将使用 from
或从文件导入 class。
感谢 importing modules from parent folder 和@woofless(以上)这是我对问题的解决方案(问题陈述实际上是我在父目录中引用模块。AWS 工具包的脚手架 Visual Studio 与 SAM 不提供适当的代码来充分引用其他父模块)!
注意下面的sys.path.insert。此外,根据@woofless,我简化了名称空间引用,使其不引用根文件夹 "health_check"。瞧!
.\cluster_health\tests\unit\test_handler.py
import sys, os, inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
parentdir = "%s\health_check"%os.path.dirname(parentdir)
sys.path.insert(0,parentdir)
print(parentdir)
import json
import pytest
import health_check
import app
import my_elastic_search