Ошибка при входе в систему ImportMismatchError при запуске py.test
Когда я выполняю тесты локально, он работает нормально, но после создания докера и запуска внутри контейнера я становлюсь ниже ошибки.
/usr/local/lib/python3.5/site-packages/_pytest/config.py:325: in _getconftestmodules
return self._path2confmods[path]
E KeyError: local('/apis/db/tests')
During handling of the above exception, another exception occurred:
/usr/local/lib/python3.5/site-packages/_pytest/config.py:356: in _importconftest
return self._conftestpath2mod[conftestpath]
E KeyError: local('/apis/db/tests/conftest.py')
During handling of the above exception, another exception occurred:
/usr/local/lib/python3.5/site-packages/_pytest/config.py:362: in _importconftest
mod = conftestpath.pyimport()
/usr/local/lib/python3.5/site-packages/py/_path/local.py:680: in pyimport
raise self.ImportMismatchError(modname, modfile, self)
_pytest.config.ConftestImportFailure: ImportMismatchError('conftest', '/projects/my_project/db/tests/conftest.py', local('/apis/db/tests/conftest.py'))
/apis - его WORKDIR в файле Docker.
Ответы
Ответ 1
Я исправил это, удалив все __pycache__ pkg в каталоге test/, проблема заключалась в том, что когда я создавал образ докера, он также собирал все мои файлы __pycache__ и *.pyc, в то время, когда тест выполнял его, используя путь к моей локальной машине вместо путь в докер-контейнере.
Заключение. Очистите файлы *.pyc и __pycache__ перед созданием образа докера.
Ответ 2
Вы можете использовать файл .dockerignore, чтобы исключить __pycache__
всех папок __pycache__
в контекст образа докера:
Файл .dockerignore
, исключает папки __pycache__
и файлы *.pyc
из всех __pycache__
/папок:
**/__pycache__
**/*.pyc
Ответ 3
Я использую Python 3.6. В моем случае я получал ImportMismatchError
в модулях с одинаковыми именами в разных пакетах, например, A/B/main.py
и C/D/main.py
Python 3 не требует файла __init__.py
в исходных папках, но добавление __init__.py
в A/B
и C/D
решило проблему.
Ответ 4
Удалите все файлы .pyc. Вы можете сделать это, find. -name \*.pyc -delete
find. -name \*.pyc -delete