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

时间:2015-07-31 18:01:52

标签: python python-3.x cython abort

基本上,我的Python程序就像我调用os.abort()一样,即使我正常退出sys.exit()(没有参数)。

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

我使用atexit进行某些操作,但是注释掉了钩子并且import语句没有任何改变。我在主循环周围有一个全局异常处理程序,但我也不知道它是怎么回事。

这里说处理程序:

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

这种情况发生在常规的ol'蟒蛇;它也会在被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 个答案:

答案 0 :(得分:0)

I deleted fx.pyd, Cython recompiled, and suddenly everything was fine. Must be gremlins.