Python3.12下执行pytest报AttributeError: collections无Mapping属性求助
问题
本地调试代码正常,但终端执行pytest命令时触发以下错误:
环境信息
- Python版本:3.12
- Allure pytest版本:2.13.5
- Selenium版本:4.22
- Pytest版本:8.2.2
错误日志
Traceback (most recent call last): File "E:\python\lib\runpy.py", line 196, in _run_module_as_main return _run_code(code, main_globals, None, File "E:\python\lib\runpy.py", line 86, in _run_code exec(code, run_globals) File "E:\python\Scripts\pytest.exe\__main__.py", line 7, in <module> sys.exit(console_main()) File "E:\python\lib\site-packages\_pytest\config\__init__.py", line 206, in console_main code = main() File "E:\python\lib\site-packages\_pytest\config\__init__.py", line 159, in main config = _prepareconfig(args, plugins) File "E:\python\lib\site-packages\_pytest\config\__init__.py", line 346, in _prepareconfig config = pluginmanager.hook.pytest_cmdline_parse( File "E:\python\lib\site-packages\pluggy\_hooks.py", line 513, in __call__ return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) File "E:\python\lib\site-packages\pluggy\_manager.py", line 120, in _hookexec return self._inner_hookexec(hook_name, methods, kwargs, firstresult) File "E:\python\lib\site-packages\pluggy\_callers.py", line 139, in _multicall raise exception.with_traceback(exception.__traceback__) File "E:\python\lib\site-packages\pluggy\_callers.py", line 122, in _multicall teardown.throw(exception) # type: ignore[union-attr] File "E:\python\lib\site-packages\_pytest\helpconfig.py", line 106, in pytest_cmdline_parse config = yield File "E:\python\lib\site-packages\pluggy\_callers.py", line 103, in _multicall res = hook_impl.function(*args) File "E:\python\lib\site-packages\_pytest\config\__init__.py", line 1152, in pytest_cmdline_parse self.parse(args) File "E:\python\lib\site-packages\_pytest\config\__init__.py", line 1501, in parse self._preparse(args, addopts=addopts) File "E:\python\lib\site-packages\_pytest\config\__init__.py", line 1388, in _preparse self.pluginmanager.load_setuptools_entrypoints("pytest11") File "E:\python\lib\site-packages\pluggy\_manager.py", line 421, in load_setuptools_entrypoints plugin = ep.load() File "E:\python\lib\importlib\metadata\__init__.py", line 171, in load module = import_module(match.group('module')) File "E:\python\lib\importlib\__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "E:\python\lib\site-packages\_pytest\assertion\rewrite.py", line 178, in exec_module exec(co, module.__dict__) File "E:\python\lib\site-packages\allure_pytest\plugin.py", line 3, in <module> import allure File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "E:\python\lib\site-packages\_pytest\assertion\rewrite.py", line 178, in exec_module exec(co, module.__dict__) File "E:\python\lib\site-packages\allure\__init__.py", line 1, in <module> from allure.pytest_plugin import MASTER_HELPER File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "E:\python\lib\site-packages\_pytest\assertion\rewrite.py", line 178, in exec_module exec(co, module.__dict__) File "E:\python\lib\site-packages\allure\pytest_plugin.py", line 9, in <module> from allure.common import AllureImpl, StepContext File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "E:\python\lib\site-packages\_pytest\assertion\rewrite.py", line 178, in exec_module exec(co, module.__dict__) File "E:\python\lib\site-packages\allure\common.py", line 19, in <module> from allure.structure import Attach, TestStep, TestCase, TestSuite, Failure, Environment, EnvParameter File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "E:\python\lib\site-packages\_pytest\assertion\rewrite.py", line 178, in exec_module exec(co, module.__dict__) File "E:\python\lib\site-packages\allure\structure.py", line 14, in <module> class Attach(xmlfied('attachment', File "E:\python\lib\site-packages\allure\rules.py", line 116, in xmlfied class MyImpl(namedlist('XMLFied', [(item[0], None) for item in items])): File "E:\python\lib\site-packages\namedlist.py", line 398, in namedlist fields, defaults = _fields_and_defaults(typename, field_names, default, rename) File "E:\python\lib\site-packages\namedlist.py", line 252, in _fields_and_defaults if isinstance(field_names, _collections.Mapping): AttributeError: module 'collections' has no attribute 'Mapping'
解决方案
这个错误是因为Python 3.10+中collections.Mapping被移到了collections.abc.Mapping,而当前安装的namedlist库版本不兼容Python 3.12,可通过以下方式解决:
方法1:升级namedlist库
执行终端命令更新到兼容版本:
pip install --upgrade namedlist
方法2:手动修改namedlist源码
如果升级后仍有问题,找到Python安装目录下的namedlist.py(路径类似E:\python\lib\site-packages\namedlist.py),打开后找到第252行:
if isinstance(field_names, _collections.Mapping):
将其修改为:
import collections.abc if isinstance(field_names, collections.abc.Mapping):
或者检查文件顶部的导入语句,确保导入了collections.abc而非仅collections。
方法3:升级allure-pytest
旧版本allure-pytest可能依赖过时的namedlist,尝试升级到最新版:
pip install --upgrade allure-pytest
内容的提问来源于stack exchange,提问作者Richer FU
相关产品推荐
相关产品推荐

