1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
PYTHON setup.py build_ext --inplace
PYTHON -c "import test_fail_in_init; test_fail_in_init.try_import()"
PYTHON -c "import test_fail_in_init_after_atexit; test_fail_in_init_after_atexit.try_import()"
######## setup.py ########
from Cython.Build.Dependencies import cythonize
from distutils.core import setup
setup(
ext_modules = cythonize("fail_in_init*.pyx")
)
######## test_fail_in_init.py ########
import sys
def try_import():
try:
import fail_in_init
except ValueError:
pass
else:
raise RuntimeError("expected ValueError from import")
if (3, 3) <= sys.version_info < (3, 5):
assert 'fail_in_init' not in sys.modules
elif 'fail_in_init' in sys.modules:
try:
sys.modules['fail_in_init'].fail()
except AttributeError:
pass # this is "ok enough"
except ValueError:
pass # this is what we had expected
else:
raise RuntimeError("expected ValueError from call through sys.modules")
######## fail_in_init.pyx ########
def fail():
raise ValueError("kaputt")
fail()
######## test_fail_in_init_after_atexit.py ########
def try_import():
try:
import fail_in_init_after_atexit
except ValueError:
pass
else:
raise RuntimeError("expected ValueError from import")
######## fail_in_init_after_atexit.pyx ########
X = 5
def callback():
try:
print(X)
except NameError:
pass # NameError is acceptable, a crash is not
import atexit
atexit.register(callback)
def fail():
raise ValueError("holla!")
fail()
|