pytest在导入时找不到模块,但代码运行得很好

时间:2018-03-02 11:25:34

标签: python-3.x cython pytest

目标是将pytest单元测试框架用于使用Cython的Python3项目。这不是一个即插即用的东西,因为默认情况下pytest无法导入Cython模块。也就是说,从Cython .pyx模块导入时出现以下错误,在我的情况下命名为' calculateScore':

L.tileLayer('/map-tiles/map_{x}_{y}.png', {
  bounds: [[-1280, -1280], [1280, 1280]]
}).addTo(map);

使用pytest-runnerpytest-cython方法时都会出现此问题。奇怪的是,当您不使用package/mainmodule.py:5: in <module> from calculateScore import some_functions E ImportError: No module named 'calculateScore' 尝试对其进行测试时,代码作为python应用程序运行得很好。 将导入样式更改为pytestimport calculateScore无济于事。

1 个答案:

答案 0 :(得分:1)

我不知道为什么会发生这种情况,但对我来说最简单的解决方案是使用 pytest-cython 方法并更改包中setup.py中列出的一项或多项内容文件:

  • 在为Extension定义ext_modules以包含Cython .pyx文件时,使用distutils.extension.Extension,而是使用 setuptools.Extension

我手动创建Extension而不是使用Cython.Build.cythonize功能的原因在这里并不重要。但请注意,对于 pytest-runner 方法:

  • 执行使用cythonize功能,但手动创建扩展程序

写完这篇文章之后,我似乎无法再使用pytest-cython来重现问题,这表明可能是其他原因导致了问题。您可以尝试的另一件事是确保:

  • Extension模块手动创建.pyx时,请确保Extension的名称与模块名称相同(因此将其命名为'calculateScore'并且例如'package.calculateScore')。

  • 删除与您的.so文件对应的已编译.pyx文件,然后重新运行。