无需就地构建扩展即可运行 Python 单元测试

jb3*_*326 7 python setuptools cython python-unittest

我有一个包含一些 Cython 扩展的 Python 3.6 包。让我们假设它的内容如下:

# example/example.pyx

def add(int a, int b):
    return a + b
Run Code Online (Sandbox Code Playgroud)

我可以使用setuptools这个脚本来构建它

# setup.py

from setuptools import setup, Extension
from Cython.Build import cythonize

example_ext = Extension(
    name='example.example',
    sources=['example/example.pyx'],
)

setup(
    name='Example package',
    packages=['example'],
    ext_modules=cythonize([example_ext]),
)
Run Code Online (Sandbox Code Playgroud)

现在我可以添加一个单元测试:

# example/tests/test_example.py

import unittest
from example.example import add

class TestExample(unittest.TestCase):
    def test_add(self):
        result = add(4, 5)
        self.assertEqual(result, 9)
Run Code Online (Sandbox Code Playgroud)

但是,如果我运行python -m unittest discover,则测试失败并显示 ,ImportError因为它找不到已编译的 Cython 模块。即使我已经使用python setup.py build_ext.

我发现使测试工作的唯一方法是使用 就地构建 Cython 模块python setup.py build_ext -i,但这似乎是不必要的。unittest如果我没有就地构建,有什么方法可以告诉库如何找到已编译的 Cython 模块?