Bug report
Bug description:
Hi, since #131802, we see test_peg_generator failing with the following warning:
Warning -- logging._handlerList was modified by test_peg_generator
Warning -- Before: (140617884985088, [<weakref at 0x7fe4271c8720; to 'logging._StderrHandler' at 0x7fe427ceb620>, <weakref at 0x7fe421d4d350; to 'setuptools_scm._log.AlwaysStdErrHandler' at 0x7fe420b25fd0>], [<weakref at 0x7fe4271c8720; to 'logging._StderrHandler' at 0x7fe427ceb620>])
Warning -- After: (140617884985088, [<weakref at 0x7fe4271c8720; to 'logging._StderrHandler' at 0x7fe427ceb620>, <weakref at 0x7fe421d4d350; to 'setuptools_scm._log.AlwaysStdErrHandler' at 0x7fe420b25fd0>], [<weakref at 0x7fe4271c8720; to 'logging._StderrHandler' at 0x7fe427ceb620>, <weakref at 0x7fe421d4d350; to 'setuptools_scm._log.AlwaysStdErrHandler' at 0x7fe420b25fd0>])
For some reason, during the execution, second reference to the same 'setuptools_scm._log.AlwaysStdErrHandler' appears in the _handlerList.
When I remove setuptools_scm, the issue is gone.
Interestingly (at least to me), when I revert changes done in #131802 in lib/test/support/__init__.py and os_helper.py (commenting out import logging is enough), the issue is gone as well, so it seems like some weird side effect of the import?
I tried to track the issue and got through setuptools all the way to ep.load() in finalize_options() which triggers the issue (see trace below).
I added some debug prints to _addHandlerRef function, and it's apparently called only once with this handler. Though I also see a single call for the logging._StderrHandler' and it's there twice as well, so I am probably overlooking something...
Here is the trace from when the handler ref is being added during the test execution:
.....
File "/build/cpython-3.13/Lib/test/test_peg_generator/test_c_parser.py", line 131, in build_extension
generate_parser_c_extension(grammar, Path('.'), library_dir=self.library_dir)
File "/build/cpython-3.13/Tools/peg_generator/pegen/testutil.py", line 107, in generate_parser_c_extension
compile_c_extension(
File "/build/cpython-3.13/Tools/peg_generator/pegen/build.py", line 160, in compile_c_extension
dist = Distribution({"name": extension_name, "ext_modules": [extension]})
File "/usr/lib/python3.13/vendor-packages/setuptools/dist.py", line 323, in __init__
_Distribution.__init__(self, dist_attrs)
File "/usr/lib/python3.13/vendor-packages/setuptools/_distutils/dist.py", line 309, in __init__
self.finalize_options()
File "/usr/lib/python3.13/vendor-packages/setuptools/dist.py", line 787, in finalize_options
for ep in sorted(loaded, key=by_order):
File "/usr/lib/python3.13/vendor-packages/setuptools/dist.py", line 786, in <lambda>
loaded = map(lambda e: e.load(), filtered)
File "/build/cpython-3.13/Lib/importlib/metadata/__init__.py", line 179, in load
module = import_module(match.group('module'))
File "/build/cpython-3.13/Lib/importlib/__init__.py", line 88, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
File "<frozen importlib._bootstrap>", line 1310, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
File "<frozen importlib._bootstrap>", line 1310, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 1026, in exec_module
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
File "/usr/lib/python3.13/vendor-packages/setuptools_scm/__init__.py", line 8, in <module>
from ._config import DEFAULT_LOCAL_SCHEME
File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 1026, in exec_module
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
File "/usr/lib/python3.13/vendor-packages/setuptools_scm/_config.py", line 15, in <module>
from . import _log
File "<frozen importlib._bootstrap>", line 1415, in _handle_fromlist
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 1026, in exec_module
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
File "/usr/lib/python3.13/vendor-packages/setuptools_scm/_log.py", line 48, in <module>
_default_handler = make_default_handler()
File "/usr/lib/python3.13/vendor-packages/setuptools_scm/_log.py", line 43, in make_default_handler
handler = AlwaysStdErrHandler()
File "/usr/lib/python3.13/vendor-packages/setuptools_scm/_log.py", line 23, in __init__
super().__init__(sys.stderr)
File "/build/cpython-3.13/Lib/logging/__init__.py", line 1128, in __init__
Handler.__init__(self)
File "/build/cpython-3.13/Lib/logging/__init__.py", line 941, in __init__
_addHandlerRef(self)
All this is with Python 3.13 (latest changes), setuptools 80.3.1, setuptools_scm 8.3.1, and on Oracle Solaris, but I don't think this is necessarily platform dependent.
I also reproduced this with older setuptools 73.0.1 and setuptools_scm 8.1.0.
CPython versions tested on:
3.13
Operating systems tested on:
Other
Bug report
Bug description:
Hi, since #131802, we see
test_peg_generatorfailing with the following warning:For some reason, during the execution, second reference to the same 'setuptools_scm._log.AlwaysStdErrHandler' appears in the
_handlerList.When I remove
setuptools_scm, the issue is gone.Interestingly (at least to me), when I revert changes done in #131802 in
lib/test/support/__init__.pyandos_helper.py(commenting outimport loggingis enough), the issue is gone as well, so it seems like some weird side effect of the import?I tried to track the issue and got through setuptools all the way to
ep.load()infinalize_options()which triggers the issue (see trace below).I added some debug prints to
_addHandlerReffunction, and it's apparently called only once with this handler. Though I also see a single call for thelogging._StderrHandler'and it's there twice as well, so I am probably overlooking something...Here is the trace from when the handler ref is being added during the test execution:
All this is with Python 3.13 (latest changes), setuptools 80.3.1, setuptools_scm 8.3.1, and on Oracle Solaris, but I don't think this is necessarily platform dependent.
I also reproduced this with older setuptools 73.0.1 and setuptools_scm 8.1.0.
CPython versions tested on:
3.13
Operating systems tested on:
Other