У меня уже было это с системой импорта Python ... думал, что я наконец-то получил что-то надежное, и тогда происходит необъяснимое!
Это структура каталогов моего приложения:
/
- my-application/
- subpackage/
- __init__.py
- my_module.py
- __init__.py
- tests/
- subpackage/
- __init__.py
- test_my_module.py
- __init__.py
- conftest.py
- run.py
- spark.py
Я запускаю все свои тесты через tests/run.py
, который выглядит следующим образом (в попытке решить все проблемы с импортом):
import os
import pytest
import sys
rootdir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
sys.path.insert(0, os.path.abspath(os.path.join(rootdir, "my-application")))
sys.exit(pytest.main([os.path.join(rootdir, "tests")]))
Это работало как абсолютный шарм, пока ясделал одну модификацию файла /my-application/subpackage/my-module.py
- добавил локальный вызов функции.Например, my_module.py:
def foo():
pass
def run_my_module():
def bar():
foo() <---- Added this line
bar()
print("Ran")
ОБНОВЛЕНИЕ : ЭТО работает нормально:
def foo():
pass
def run_my_module():
def bar():
pass
foo()
bar()
print("Ran")
Как только я добавил вызов локальной функции, тесты перестали работать, с ошибкой No module named "subpackage"
.
test_my_module.py
выглядит следующим образом (в основном):
from subpackage.my_module import run_my_module
def basic_test():
run_my_module()
Обратите внимание, что в test_my_module.py
я использую subpackage
в качестве первой частимоего оператора импорта, потому что я использую файл run.py
, который устанавливает my-application
в качестве системного пути.Если я изменю импорт, чтобы начать с my_application
, я получу ту же ошибку со ссылкой на my_application.py
.
Я все еще изучаю Python, поэтому предложите любые изменения в структуре моего приложения, которые вам нравятся.Я не могу поверить в трудности этой системы импорта - я чувствую, что мне здесь не хватает чего-то простого ...
Заранее спасибо!