首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cython编译错误“不能在windows中使用mingw64将类型'double‘分配给’int‘,但在linux中可以。

Cython编译错误“不能在windows中使用mingw64将类型'double‘分配给’int‘,但在linux中可以。
EN

Stack Overflow用户
提问于 2020-11-20 15:24:13
回答 2查看 1.2K关注 0票数 0

我在安装使用traj-dist https://github.com/bguillouet/traj-dist的python包时遇到了问题。它可以在Linux上安装,可以用gcc来安装,但不能在winodws中用mingw64 gcc安装。

我使用Python3.8,Cython 0.29.21。

python setup.py build_ext --inplace --force

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

代码语言:javascript
运行
复制
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'

编译错误的文件是dist/cydist/frechet.pyx

如何在windows中编译它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-20 17:37:44

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

代码语言:javascript
运行
复制
def f():
    cdef int a = 3/2

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

Cython可以同时模拟Python2和Python3。详细信息请参见这个答案。对于Cython0.29.x,默认情况下它将模拟Python 2(但警告您应该显式设置级别),因此文件将编译。对于Cython3.0alpha(和更高的版本)--我怀疑您在Windows上也有--默认情况下它将模仿Py3 (使用字符串的小例外)。

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

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

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

您还应该向包的维护人员提交一个bug报告,告诉他们这个包将被即将发布的Cython3.0版本破坏,并且他们可以使用这些方法之一修复它。

票数 3
EN

Stack Overflow用户

发布于 2020-11-20 16:46:28

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

例如,在Python 2.7中:

代码语言:javascript
运行
复制
>>> 4/3
1

在Python 3.6中:

代码语言:javascript
运行
复制
>>> 4/3
1.3333333333333333
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64932145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档