我有一个Python 3.6包,其中包含一些Cython扩展。我们假设它的内容如下:
# example/example.pyx
def add(int a, int b):
return a + b
我可以使用此脚本
使用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]),
)
现在我可以添加一个单元测试:
# 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)
但是,如果我运行python -m unittest discover
,测试将失败并显示ImportError
,因为它无法找到已编译的Cython模块。即使我已经使用python setup.py build_ext
构建了模块,也会发生这种情况。
我发现使测试工作的唯一方法是使用python setup.py build_ext -i
就地构建Cython模块,但这看起来应该是不必要的。如果我没有就地构建,有没有办法告诉unittest
库如何找到已编译的Cython模块?