Cython 编译错误 "Cannot assign type 'double' to 'int'" 在 windows 中使用 mingw64 但在 linux 中正常

Cython compile error "Cannot assign type 'double' to 'int'" using mingw64 in windows but ok in linux

我在安装使用 Cython 的 python 包 traj-dist https://github.com/bguillouet/traj-dist 时遇到问题。 Linux用gcc编译后可以安装,winodws用mingw64 gcc不能安装

我用的是Python3.8,Cython 0.29.21.

python setup.py build_ext --inplace --force

完整的输出错误信息是HERE

Error compiling Cython file:
------------------------------------------------------------
...
    q=len(Q)

    cc=_compute_critical_values(P,Q,p,q)
    eps=cc[0]
    while(len(cc)!=1):
        m_i=len(cc)/2-1
                    ^
------------------------------------------------------------

traj_dist\cydist\frechet.pyx:535:21: Cannot assign type 'double' to 'int'

编译错误的文件是https://github.com/bguillouet/traj-dist/blob/master/traj_dist/cydist/frechet.pyx

如何在windows中编译它?

您使用的 Python 是什么版本?看起来 >= 3.6 是必需的。我不知道这个变化是从哪个版本开始的,但整数数学从 Python 2.7 更改为 Python 3.6.

例如 Python 2.7:

>>> 4/3
1

在 Python 3.6:

>>> 4/3
1.3333333333333333

我认为您在 Windows 和 Linux 上使用了不同的 Cython 版本。这是一个简化的例子:

def f():
    cdef int a = 3/2

Python 3 的行为是 return 1.5 而 Python 2 的行为是 return 1.

Cython 可以模拟 Python 2 和 Python 3。参见 for extensive details. For Cython 0.29.x it will emulate Python 2 by default (but give you a warning that the level should be set explicitly) and thus the file will compile. For Cython 3.0alpha (and higher) - which I suspect you have on Windows - it'll emulate Py3 by default (with a small exception for strings)。

当遵循 Py3 行为时,Cython 不乐意将 C 双精度值分配给 C 整数,因为并非所有双精度值都适合整数。

您可以进行两项更改以使其通过编译。你只需要制作其中一个

  1. 使用 // 而不是 / 进行强制整数除法。
  2. 在 setup.py 中或在带有 # cython: language_level=2
  3. 的文件顶部将 Cython 语言级别设置为 2

您还应该向包的维护者提交错误报告,告诉他们该包将被即将发布的 Cython 3.0 版本破坏,并且他们可以使用其中一种方法修复它。