Cython 在 Windows 中使用 mingw64 编译错误“无法将类型 'double' 分配给 'int'”,但在 linux 中正常

WZh*_*hao 1 python cython

我在安装traj-dist 使用Cython. 在Linux下使用gcc编译后可以安装,但在winodws下使用mingw64 gcc编译后无法安装。

我使用Python 3.8,Cython 0.29.21。

python setup.py build_ext --inplace --force

完整的输出错误消息在这里

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'
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能在windows下编译它?

Dav*_*idW 6

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

def f():
    cdef int a = 3/2
Run Code Online (Sandbox Code Playgroud)

Python 3 的行为将返回 1.5,而 Python 2 的行为将返回 1。

Cython 可以模拟 Python 2 和 Python 3。有关详细信息,请参阅此答案。对于 Cython 0.29.x,它将默认模拟 Python 2(但会警告您应显式设置级别),因此文件将进行编译。对于 Cython 3.0alpha (及更高版本) - 我怀疑您在 Windows 上有 - 它默认会模拟 Py3 (字符串有一个小例外)。

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

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

  1. 使用//而不是/强制整数除法。
  2. 在 setup.py 中或在文件顶部使用以下命令将 Cython 语言级别设置为 2# cython: language_level=2

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