Python 3.x pytest无法在导入时找到模块,但代码运行正常

Python 3.x pytest无法在导入时找到模块,但代码运行正常,python-3.x,cython,pytest,Python 3.x,Cython,Pytest,目标是为使用Cython的Python3项目使用pytest单元测试框架。这不是一个即插即用的东西,因为pytest默认情况下不能导入Cython模块。也就是说,从Cython.pyx模块导入时,在名为“calculateScore”的示例中,出现以下错误: package/mainmodule.py:5: in <module> from calculateScore import some_functions E ImportError: No module name

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

package/mainmodule.py:5: in <module>
    from calculateScore import some_functions
E   ImportError: No module named 'calculateScore'
package/mainmodule.py:5:in
从calculateScore导入一些函数
E ImportError:没有名为“calculateScore”的模块
此问题在使用和方法时都会发生。奇怪的是,当您不尝试使用
pytest
对其进行测试时,该代码作为python应用程序运行良好。
将导入样式更改为
import calculateScore
import package.calculateScore
没有帮助。

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

  • ext\u模块定义
    扩展名
    以包含Cython
    .pyx
    文件时,不要使用
    distutils.Extension.Extension
    ,而是使用
    setuptools.Extension
我手动创建
扩展
而不是使用
Cython.Build.cythonize
函数的原因在这里并不重要。但请注意,对于pytest runner方法:

  • 不要使用
    cythonize
    功能,而是手动创建扩展名
在写了这篇文章之后,我似乎再也不能使用
pytest-cython
重现这个问题了,这表明可能是其他原因导致了这个问题。您可以尝试的另一件事是确保:

  • .pyx
    模块手动创建
    扩展名时,请确保
    扩展名
    与模块名相同(因此将其命名为“calculateScore”,而不是例如“package.calculateScore”)

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


但为什么必须这样做?这是Pytest bug吗?我来这里是想了解实际情况,但我只得到了更多的问题…不知道,抱歉:/n问题可能与此问题有关:请尝试在.pyx文件中设置linetrace=True C编译器指令