Two "easy" ways to get tracebacks which contain useless importlib._bootstrap rows:
- When there is a syntax error in the imported module
- On "import package.module", when top-level package cannot be imported
$ ./python -c "import foo"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "<frozen importlib._bootstrap>", line 1421, in _find_and_load
File "<frozen importlib._bootstrap>", line 1388, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 527, in _check_name_wrapper
File "<frozen importlib._bootstrap>", line 899, in load_module
File "<frozen importlib._bootstrap>", line 880, in load_module
File "<frozen importlib._bootstrap>", line 503, in module_for_loader_wrapper
File "<frozen importlib._bootstrap>", line 744, in _load_module
File "<frozen importlib._bootstrap>", line 857, in get_code
File "./foo.py", line 1
invalid syntax
^
SyntaxError: invalid syntax
$ ./python
Python 3.3.0b1 (default:afdb0e1a9dac+, Jul 19 2012, 23:55:02)
[GCC 4.4.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import _sqlite3
>>> del _sqlite3.register_converter
>>> import sqlite3.dump
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<frozen importlib._bootstrap>", line 1421, in _find_and_load
File "<frozen importlib._bootstrap>", line 1372, in _find_and_load_unlocked
File "/home/amauryfa/python/cpython3.x/Lib/sqlite3/__init__.py", line 23, in <module>
from sqlite3.dbapi2 import *
File "/home/amauryfa/python/cpython3.x/Lib/sqlite3/dbapi2.py", line 83, in <module>
register_adapters_and_converters()
File "/home/amauryfa/python/cpython3.x/Lib/sqlite3/dbapi2.py", line 80, in register_adapters_and_converters
register_converter("date", convert_date)
NameError: global name 'register_converter' is not defined
|
OK, to investigate the failures a bit further, I turned off the traceback suppression altogether by sticking an immediate return at the start of remove_importlib_frames. For the three failing tests, this is what I got when adding a traceback.print_tb call:
test_broken_from (test.test_import.ImportTracebackTests) ... File "/home/ncoghlan/devel/py3k/Lib/test/test_import.py", line 890, in test_broken_from
from _parent_foo import bar
File "<frozen importlib._bootstrap>", line 1572, in _handle_fromlist
File "<frozen importlib._bootstrap>", line 1524, in _find_and_load
File "<frozen importlib._bootstrap>", line 1491, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 571, in _check_name_wrapper
File "<frozen importlib._bootstrap>", line 1002, in load_module
File "<frozen importlib._bootstrap>", line 983, in load_module
File "<frozen importlib._bootstrap>", line 547, in module_for_loader_wrapper
File "<frozen importlib._bootstrap>", line 853, in _load_module
File "<frozen importlib._bootstrap>", line 860, in _exec_module
File "./_parent_foo/bar.py", line 1, in <module>
1/0
FAIL
test_broken_parent (test.test_import.ImportTracebackTests) ... File "/home/ncoghlan/devel/py3k/Lib/test/test_import.py", line 902, in test_broken_parent
import _parent_foo.bar
File "<frozen importlib._bootstrap>", line 1524, in _find_and_load
File "<frozen importlib._bootstrap>", line 1475, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 1524, in _find_and_load
File "<frozen importlib._bootstrap>", line 1491, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 571, in _check_name_wrapper
File "<frozen importlib._bootstrap>", line 1002, in load_module
File "<frozen importlib._bootstrap>", line 983, in load_module
File "<frozen importlib._bootstrap>", line 547, in module_for_loader_wrapper
File "<frozen importlib._bootstrap>", line 853, in _load_module
File "<frozen importlib._bootstrap>", line 860, in _exec_module
File "./_parent_foo/__init__.py", line 1, in <module>
1/0
FAIL
test_syntax_error (test.test_import.ImportTracebackTests) ... File "/home/ncoghlan/devel/py3k/Lib/test/test_import.py", line 851, in test_syntax_error
import foo
File "<frozen importlib._bootstrap>", line 1524, in _find_and_load
File "<frozen importlib._bootstrap>", line 1491, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 571, in _check_name_wrapper
File "<frozen importlib._bootstrap>", line 1002, in load_module
File "<frozen importlib._bootstrap>", line 983, in load_module
File "<frozen importlib._bootstrap>", line 547, in module_for_loader_wrapper
File "<frozen importlib._bootstrap>", line 838, in _load_module
File "<frozen importlib._bootstrap>", line 960, in get_code
FAIL
And here's what I get with my patched version enabled (which also ignores chunks ending with get_code when the failure is a syntax error):
test_broken_from (test.test_import.ImportTracebackTests) ... File "/home/ncoghlan/devel/py3k/Lib/test/test_import.py", line 890, in test_broken_from
from _parent_foo import bar
File "<frozen importlib._bootstrap>", line 1572, in _handle_fromlist
File "./_parent_foo/bar.py", line 1, in <module>
1/0
FAIL
test_broken_parent (test.test_import.ImportTracebackTests) ... File "/home/ncoghlan/devel/py3k/Lib/test/test_import.py", line 902, in test_broken_parent
import _parent_foo.bar
File "<frozen importlib._bootstrap>", line 1524, in _find_and_load
File "<frozen importlib._bootstrap>", line 1475, in _find_and_load_unlocked
File "./_parent_foo/__init__.py", line 1, in <module>
1/0
FAIL
test_syntax_error (test.test_import.ImportTracebackTests) ... File "/home/ncoghlan/devel/py3k/Lib/test/test_import.py", line 851, in test_syntax_error
import foo
FAIL
|