在 Python 个测试中重新加载共享 Fortran 库

Reload shared Fortran library in Python tests

我已经将一个应用程序从 Fortran 翻译成 Python / NumPy,并且想测试 Python 和 Fortran 实现之间的一致性。 Fortran 代码通过 f2py 公开了一个接口,因此我可以从 Python 导入和调用 Fortran 例程就好了。

当 运行背靠背进行多项测试时会出现问题。 Fortran 代码并非完全无状态,并且使用了一些 allocatable 数组,因此 运行 将相同的代码两次通常会完全失败或导致不同的结果。

我尝试在不同的进程中导入 Fortran 库并通过 multiprocessing.managers.BaseManager 与主进程通信,但它会泄漏内存(似乎通信对象使用的内存未释放)。我可以 运行 在一个单独的过程中进行每个测试,但我还没有找到一种干净的方法 pytest

因此,我的问题是:是否有一种方法可以强制重新加载共享的 Fortran 库,或者,一种干净的方法 运行 在单独的进程中使用断言、回溯等进行每个测试仍然运行良好?

如果可能的话,我不想接触有问题的 Fortran 代码。

我最终接受了 phd 的建议,使用 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} 并行测试。