Python Cython编译错误“;无法分配类型';双倍';至';int'&引用;在windows中使用mingw64,但在linux中使用ok

Python Cython编译错误“;无法分配类型';双倍';至';int'&引用;在windows中使用mingw64,但在linux中使用ok,python,cython,Python,Cython,我在安装使用Cython的python包时遇到问题。它可以在使用gcc组合后安装在Linux中,但不能在使用mingw64 gcc的winodws中安装 我使用Python 3.8,Cython 0.29.21 python setup.py build\u ext--inplace--force 完整输出错误消息为 编译Cython文件时出错: ------------------------------------------------------------ ... q=len(q) c

我在安装使用Cython的python包时遇到问题。它可以在使用gcc组合后安装在Linux中,但不能在使用mingw64 gcc的winodws中安装

我使用Python 3.8,Cython 0.29.21

python setup.py build\u ext--inplace--force

完整输出错误消息为

编译Cython文件时出错: ------------------------------------------------------------ ... q=len(q) cc=_计算_临界值(P,Q,P,Q) 每股收益=cc[0] 而(len(cc)!=1): m_i=len(cc)/2-1 ^ ------------------------------------------------------------ traj_dist\cydist\frechet.pyx:535:21:无法将类型“double”分配给“int” 出现编译错误的文件是


如何在windows中编译它?

您使用的是什么版本的Python?看起来>=3.6是必需的。我不知道这个变化是从哪个版本开始的,但是integer math从Python2.7变为Python3.6

例如,在Python 2.7中:

>>> 4/3
1
在Python 3.6中:

>>> 4/3
1.3333333333333333

您使用的是什么版本的Python?看起来>=3.6是必需的。我不知道这个变化是从哪个版本开始的,但是integer math从Python2.7变为Python3.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的行为将返回1.5,而Python 2的行为将返回1

Cython可以同时模拟Python 2和Python 3。有关详细信息,请参阅。对于Cython0.29.x,默认情况下它将模拟Python2(但警告您应该显式设置级别),因此文件将编译。对于Cython3.0alpha(和更高版本)——我怀疑你在Windows上有——它将在默认情况下模拟Py3(使用)

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

您可以进行两个更改,使其能够编译。你只需要做一个

  • 使用
    /
    代替
    /
    强制整数除法
  • 在setup.py中或在文件顶部使用
    #Cython:language_level=2将Cython语言级别设置为2

  • 您还应该向软件包的维护人员提交一份错误报告,告诉他们即将发布的Cython 3.0版本将破坏软件包,并且他们可以使用这些方法之一来修复它。

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

    def f():
        cdef int a = 3/2
    
    Python 3的行为将返回1.5,而Python 2的行为将返回1

    Cython可以同时模拟Python 2和Python 3。有关详细信息,请参阅。对于Cython0.29.x,默认情况下它将模拟Python2(但警告您应该显式设置级别),因此文件将编译。对于Cython3.0alpha(和更高版本)——我怀疑你在Windows上有——它将在默认情况下模拟Py3(使用)

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

    您可以进行两个更改,使其能够编译。你只需要做一个

  • 使用
    /
    代替
    /
    强制整数除法
  • 在setup.py中或在文件顶部使用
    #Cython:language_level=2将Cython语言级别设置为2

  • 您还应该向软件包的维护人员提交一份错误报告,告诉他们即将发布的Cython 3.0版本将破坏软件包,并且他们可以使用这些方法之一修复它。

    这是Cython的错误,因此您使用的C编译器与此无关。而Cython版本可能be@DavidW我同意。我使用了Cython v0.29.21。这是来自Cython的错误,因此您使用的C编译器不相关。而Cython版本可能be@DavidW我同意。我使用了Cython v0.29.21。我认为这是正确的想法,但并不完全正确。Cython可以(在某种程度上)遵循Py2或Py3的行为,而使用的Python版本并不能真正决定这一点。在windows上使用Python3.8时会出现错误。我认为这是正确的想法,但并不完全正确。Cython可以(在某种程度上)遵循Py2或Py3的行为,而使用的Python版本并不能真正决定这一点。在windows上使用Python3.8时发生错误。