每当导入 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++ 编程)[关闭]