每当导入 Cython 模块时,Python 程序 abort()-ed 在正常退出时

Posted

技术标签:

【中文标题】每当导入 Cython 模块时,Python 程序 abort()-ed 在正常退出时【英文标题】:Python program abort()-ed on normal exit whenever Cython module is imported 【发布时间】:2015-07-31 18:01:51 【问题描述】:

基本上,我的 Python 程序表现得好像我调用了 os.abort(),即使我使用 sys.exit()(没有参数)正常退出。

当程序终止时,它给了我标准的“此应用程序已请求运行时以不寻常的方式终止它”。它不是崩溃,(好吧,除非在关机例程中发生了某些事情,但我没有看到任何证据)它只会在它应该终止时终止 - 它只是弹出一个烦人的对话框每当它这样做。

我在某些事情上使用atexit,但注释掉钩子并且导入语句没有任何改变。我在主循环周围有一个全局异常处理程序,但我也不明白它是怎么回事。

这里说的处理程序:

try:
    while True:
        #...
except Exception:
    if _distributable:
        #Crash reporting! Yay!
        send_error_report("Unhandled exception")
    else:
        raise

这发生在普通的 ol' Python 上;它也发生在被 cx_freeze 冻结之后,但这不可能是原因,因为如果我只是在我的 IDE 中运行 .py 脚本也会发生这种情况。

我使用 Cython 模块进行一些简单的数字运算,如果这可能与它有关的话。

编辑:

注释掉 Cython 导入修复了它。现在我只需要弄清楚为什么 Cython 会导致这种情况......

这是完整的 Cython 代码:

import pygame
cimport numpy
import numpy.random
from libc.stdlib cimport abs

cpdef chromatic_aberration(surface,int intensity=5):
    cdef int x,y,z,maxx,maxy
    cdef numpy.ndarray[unsigned char,ndim=3] array
    cdef numpy.ndarray[unsigned char,ndim=2] r,g,b
    r=pygame.surfarray.pixels_red(surface)
    g=pygame.surfarray.pixels_green(surface)
    b=pygame.surfarray.pixels_blue(surface)
    array=pygame.surfarray.pixels3d(surface)

    maxx,maxy=surface.get_rect().bottomright

    for x in range(maxx):
        for y in range(maxy):
            try:
                pass
                array[x,y,0]=r[x+intensity,y]
                array[x,y,1]=g[x,y+intensity]
                array[x,y,2]=b[x+intensity,y-intensity]
            except IndexError:
                pass

cpdef mapped_chromatic_aberration(surface, numpy.ndarray[int,ndim=2] intensitymap):
    cdef int x,y,z,maxx,maxy,intensity
    cdef numpy.ndarray[unsigned char,ndim=3] array
    cdef numpy.ndarray[unsigned char,ndim=2] r,g,b
    r=pygame.surfarray.pixels_red(surface)
    g=pygame.surfarray.pixels_green(surface)
    b=pygame.surfarray.pixels_blue(surface)
    array=pygame.surfarray.pixels3d(surface)

    maxx,maxy=surface.get_rect().bottomright

    for x in range(maxx):
        for y in range(maxy):
            try:
                intensity=intensitymap[x,y]
                array[x,y,0]=r[x+intensity,y]
                array[x,y,1]=g[x,y+intensity]
                array[x,y,2]=b[x+intensity,y-intensity]
            except IndexError:
                pass

cpdef random_chromatic_aberration(surface,int intensity=5):
    mapped_chromatic_aberration(surface,numpy.random.random_integers(-intensity,intensity,surface.get_rect().bottomright))

cpdef chroma_warp(surface,int x, int y, int radius, int power):
    cdef numpy.ndarray[int,ndim=2] warpmap
    warpmap=numpy.zeros(surface.get_size(), dtype=numpy.int)
    cdef int maxdist = radius ** 2
    cdef int maxx, minx, maxy, miny, warpx, warpy

    for xofst in range(-radius, radius):
        for yofst in range(-radius, radius):
            warpx=x+xofst
            warpy=y+yofst
            warpmap[warpx,warpy] = ((abs(xofst) + abs(yofst)) * power) // 100

    mapped_chromatic_aberration(surface, warpmap)

如果我用调试器运行程序也不会发生这种情况。

【问题讨论】:

【参考方案1】:

我删除了fx.pyd,重新编译了 Cython,突然一切都好了。一定是小妖精。

【讨论】:

以上是关于每当导入 Cython 模块时,Python 程序 abort()-ed 在正常退出时的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Cython 生成的模块从 python 导入 C/C++ 主文件? (用 C/C++ 编程)[关闭]

ImportError:没有名为 Cython.Distutils 的模块

cx_Freeze 无法包含 Cython .pyx 模块

如何在 cython 模块中使用外部包装类?

python sys.modules模块

Conda Cython 构建 PYD/SO 文件