Ошибка при входе в систему 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