В основном, моя программа Python ведет себя так, как если бы я звонил os.abort()
, хотя я обычно уходил с sys.exit()
(без параметров).Программа Python abort() - ed при нормальном выходе всякий раз, когда импортируется модуль Cython.
Это дает мне стандарт «Это приложение попросило Runtime прекратить его необычным способом», когда программа завершается. Это не crashing (ну, если что-то не происходит внутри процедур выключения, но я не вижу никаких доказательств этого), он заканчивается только тогда, когда он должен заканчиваться - он просто выдает раздражающее диалоговое окно всякий раз, когда он это делает.
Я использую atexit
для некоторых вещей, но комментирую крючок, и оператор импорта ничего не меняет. У меня есть глобальный обработчик исключений вокруг основного цикла, но я не вижу, как это может быть и оно.
Вот сказал обработчик:
try:
while True:
#...
except Exception:
if _distributable:
#Crash reporting! Yay!
send_error_report("Unhandled exception")
else:
raise
Это происходит с регулярным ола»Python; это происходит после того, как он был заморожен с помощью cx_freeze, но это не может быть причиной, потому что это также происходит, если я просто запускаю сценарий .py в своей среде IDE.
Я использую модуль Cython для некоторых простых хрустов, если это может иметь какое-либо отношение к нему.
EDIT:
Комментирование импорта 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)
Это также не произойдет, если я запускаю программу с отладчиком.