Перезагрузите общую библиотеку Fortran в тестах Python

Я перевел приложение с Fortran на Python/NumPy и хочу проверить согласованность между реализациями Python и Fortran. Код Fortran предоставляет интерфейс через f2py, поэтому я могу без проблем импортировать и вызывать подпрограммы Fortran из Python.

Проблема возникает при запуске нескольких тестов подряд. Код Fortran не полностью не имеет состояния и использует некоторые массивы allocatable, поэтому запуск одного и того же кода дважды обычно приводит к сбою или приводит к разным результатам.

Я попытался импортировать библиотеку Fortran в другой процесс и связаться с основным процессом через multiprocessing.managers.BaseManager, но происходит утечка памяти (похоже, что память, используемая переданными объектами, не освобождается). Я мог бы запускать каждый тест в отдельном процессе, но мне еще предстоит найти чистый способ сделать это с помощью pytest.

Отсюда мой вопрос: есть ли способ принудительно перезагрузить общую библиотеку Fortran или, альтернативно, чистый способ запустить каждый тест в отдельном процессе с утверждениями, обратными трассировками и т. д., которые все еще хорошо работают?

Если это вообще возможно, я бы не хотел касаться рассматриваемого кода Fortran.


person Dion    schedule 15.02.2018    source источник
comment
Как вы загружаете библиотеку в первую очередь? Пожалуйста, покажите какой-нибудь код.   -  person Vladimir F    schedule 15.02.2018
comment
Используйте pytest-xdist с pytest -v --forked --numprocesses=1 для запуска каждого теста в отдельном процессе.   -  person phd    schedule 15.02.2018


Ответы (1)


В итоге я согласился с предложением доктора философии использовать pytest-xdist. Я добавил следующее к setup.cfg:

[tool:pytest]
addopts = --forked

Таким образом, pytest будет использовать --forked по умолчанию, поэтому люди не будут запускать тесты, не создавая новый процесс для каждого теста. Я также добавил это к setup.py:

setup(
   ...
   extras_require={'test': ['pytest', 'pytest-xdist']}
)

Таким образом, вы можете сделать pip install package[test] и получить все пакеты, необходимые для тестирования.

В качестве бонуса вы даже можете запускать тесты параллельно, используя pytest -n {nproc}.

person Dion    schedule 27.02.2018