在 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}
并行测试。
我已经将一个应用程序从 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}
并行测试。