我正在尝试在包含一些 cython 代码的文件夹
mymodule
中构建一个 python 模块。然而,在Windows上,通过pip安装它,即使安装了它也找不到Cython。在Linux上,不会出现这样的问题。
作为一个最小的例子,假设我有一个 cython 文件
calculations.pyx
和一个 setup.py
。
mymodule
|
|-- calculations.pyx
+-- setup.py
setup.py
看起来像这样:
from setuptools import setup, Extension
from Cython.Build import cythonize
setup(
name='mymodule',
version='0.1',
install_requires=['Cython'],
ext_modules=cythonize(Extension(
'calculations',
sources=['calculations.pyx'],
)),
)
当我在 Linux 上安装此模块 (
pip install -e mymodule
) 时,该模块会正确安装,并且 cython 会构建二进制文件。当我尝试在 Windows 上安装该模块时,出现 ModuleNotFoundError: No module named 'Cython'
错误。但是,如果我自己使用 python setup.py build_ext --inplace
构建扩展,它就可以正常工作。
我已验证 Cython 已安装。即使没有安装,也应该在运行
pip install -e mymodule
命令后安装,因为它列在 install_requires
列表中。我已经在 Linux 上验证了这一点,如果在运行 setup.py
之前不存在 Cython,则 Cython 已正确安装为依赖项。
这可能是什么问题? 另外,我只安装了一个 Python 版本,而不是多个。
对于任何有同样问题的人:我找到了一个可以解决问题的解决方案,尽管我不明白为什么。通过将
pyproject.toml
文件放在根目录 mymodule
中,该文件告诉 pip 运行 setup.py
所需的包。来源:https://cython.readthedocs.io/en/latest/src/userguide/source_files_and_compilation.html
toml 文件:
[build-system]
requires = ["setuptools", "Cython"]
现在它可以运行并编译了。然而,我仍然不明白为什么它在 Linux 上工作,也不明白为什么它在 Windows 上不起作用,即使我已经安装了 cython alredy。