Windows下pip安装含Cython的Python模块时出现ModuleNotFoundError,Linux无此问题
问题原因
在Windows环境下使用pip install -e(可编辑模式)安装时,pip的处理流程和Linux存在差异:pip会优先执行setup.py提取包的元数据,但此时install_requires中声明的Cython还未被安装,而你的setup.py在模块顶部直接导入了Cython.Build.cythonize,这就触发了ModuleNotFoundError。
直接运行python setup.py build_ext --inplace能成功,是因为当前Python环境已经提前安装了Cython;Linux上能正常工作,是因为pip在处理可编辑安装时,会优先安装install_requires中的依赖再执行setup.py(或环境中已有Cython缓存)。
解决方案
方案1:用pyproject.toml声明构建依赖(推荐,符合PEP 518规范)
在mymodule目录下创建pyproject.toml文件,内容如下:
[build-system] requires = ["setuptools", "wheel", "Cython"] build-backend = "setuptools.build_meta"
这个文件会告知pip:必须先安装这些构建依赖,才能执行setup.py。这样Cython会在构建前被自动安装,彻底解决导入问题。
方案2:延迟Cython的导入到setup函数内部
修改setup.py,将Cython的导入和cythonize调用延迟到setup()函数执行时,避免模块导入阶段触发:
from setuptools import setup, Extension setup( name='mymodule', version='0.1', install_requires=['Cython'], ext_modules=__import__('Cython.Build').cythonize( Extension('calculations', sources=['calculations.pyx']) ), )
这种方式兼容性稍差,仅作为备选方案。
内容的提问来源于stack exchange,提问作者sunnytown
相关产品推荐
相关产品推荐

