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 整数,因为并非所有双精度值都适合整数。
您可以进行两项更改以使其通过编译。你只需要制作其中一个
- 使用
//
而不是 /
进行强制整数除法。
- 在 setup.py 中或在带有
# cython: language_level=2
的文件顶部将 Cython 语言级别设置为 2
您还应该向包的维护者提交错误报告,告诉他们该包将被即将发布的 Cython 3.0 版本破坏,并且他们可以使用其中一种方法修复它。
我在安装使用 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。参见
当遵循 Py3 行为时,Cython 不乐意将 C 双精度值分配给 C 整数,因为并非所有双精度值都适合整数。
您可以进行两项更改以使其通过编译。你只需要制作其中一个
- 使用
//
而不是/
进行强制整数除法。 - 在 setup.py 中或在带有
# cython: language_level=2
的文件顶部将 Cython 语言级别设置为 2
您还应该向包的维护者提交错误报告,告诉他们该包将被即将发布的 Cython 3.0 版本破坏,并且他们可以使用其中一种方法修复它。