记一次pytest运行报错-UnicodeDecodeError: 'gbk' codec can't decode byte 0xb0 in position 26: illegal multiby

最近学习pytest时,配置pytest.ini后,运行pytest报错,错误如下:

D:\pythonproject\AndroidUIauto\Test_App>pytest
Traceback (most recent call last):
  File "d:\python\python37\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "d:\python\python37\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "D:\Python\Python37\Scripts\pytest.exe\__main__.py", line 9, in <module>
  File "d:\python\python37\lib\site-packages\_pytest\config\__init__.py", line 60, in main
    config = _prepareconfig(args, plugins)
  File "d:\python\python37\lib\site-packages\_pytest\config\__init__.py", line 195, in _prepareconfig
    pluginmanager=pluginmanager, args=args
  File "d:\python\python37\lib\site-packages\pluggy\hooks.py", line 289, in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
  File "d:\python\python37\lib\site-packages\pluggy\manager.py", line 68, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "d:\python\python37\lib\site-packages\pluggy\manager.py", line 62, in <lambda>
    firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
  File "d:\python\python37\lib\site-packages\pluggy\callers.py", line 203, in _multicall
    gen.send(outcome)
  File "d:\python\python37\lib\site-packages\_pytest\helpconfig.py", line 93, in pytest_cmdline_parse
    config = outcome.get_result()
  File "d:\python\python37\lib\site-packages\pluggy\callers.py", line 80, in get_result
    raise ex[1].with_traceback(ex[2])
  File "d:\python\python37\lib\site-packages\pluggy\callers.py", line 187, in _multicall
    res = hook_impl.function(*args)
  File "d:\python\python37\lib\site-packages\_pytest\config\__init__.py", line 654, in pytest_cmdline_parse
    self.parse(args)
  File "d:\python\python37\lib\site-packages\_pytest\config\__init__.py", line 871, in parse
    self._preparse(args, addopts=addopts)
  File "d:\python\python37\lib\site-packages\_pytest\config\__init__.py", line 804, in _preparse
    self._initini(args)
  File "d:\python\python37\lib\site-packages\_pytest\config\__init__.py", line 727, in _initini
    config=self,
  File "d:\python\python37\lib\site-packages\_pytest\config\findpaths.py", line 122, in determine_setup
    rootdir, inifile, inicfg = getcfg([ancestor], config=config)
  File "d:\python\python37\lib\site-packages\_pytest\config\findpaths.py", line 35, in getcfg
    iniconfig = py.iniconfig.IniConfig(p)
  File "d:\python\python37\lib\site-packages\py\_vendored_packages\iniconfig.py", line 54, in __init__
    tokens = self._parse(iter(f))
  File "d:\python\python37\lib\site-packages\py\_vendored_packages\iniconfig.py", line 82, in _parse
    for lineno, line in enumerate(line_iter):
UnicodeDecodeError: 'gbk' codec can't decode byte 0xb0 in position 26: illegal multibyte sequence

解决办法:
更改pytest.ini 文件编码方式为GBK,再次运行不在报错。
在这里插入图片描述在这里插入图片描述
原因:
目前未知,不知道具体为什么要这样更改,先记录以便后续跟进。

### 问题分析与解决方案 在运行 pytest 时出现 `UnicodeDecodeError: 'utf-8' codec can't decode byte` 错误,通常是由于 Python 在读取文件时遇到非 UTF-8 编码的内容,而默认情况下 Python 在 Linux 系统(如 Ubuntu)中使用 UTF-8 编码。以下是针对该问题的详细分析和解决方案。 #### 1. **问题根源** Python 中的 `open` 方法在不同操作系统中的默认编码方式存在差异: - 在 Windows 系统中,默认编码为 GBK。 - 在 Linux 系统(如 Ubuntu)中,默认编码为 UTF-8。 如果项目中某些文件是以 GBK 编码保存的,而 pytest 在 Ubuntu 环境下运行时尝试以 UTF-8 编码读取这些文件,则会引发 `UnicodeDecodeError` 错误[^1]。 #### 2. **解决方法** ##### 方法一:修改 iniconfig 模块的编码方式 通过调整 iniconfig 模块的默认编码方式,可以避免 pytest 在读取配置文件时因编码不匹配导致的错误。 具体步骤如下: 1. 找到 iniconfig 模块下的 `__init__.py` 文件。可以通过以下命令定位: ```bash find /usr -name "__init__.py" | grep iniconfig ``` 2. 打开该文件,在第 52 行左右找到 `open` 方法调用的位置,添加 `encoding="gbk"` 参数。例如: ```python with open(path, encoding="gbk") as f: content = f.read() ``` 这种方法适用于临时解决问题,但可能会导致兼容性问题,建议谨慎使用。 ##### 方法二:转换文件编码为 UTF-8 将所有相关文件从 GBK 编码转换为 UTF-8 编码,确保 pytest运行时不会因编码冲突报错。可以使用 Python 的 `codecs` 库实现编码转换: ```python import codecs file_path = "example.txt" # 原始文件路径 new_file_path = "example_utf8.txt" # 转换后的文件路径 with codecs.open(file_path, 'r', encoding='GBK') as f: content = f.read() with codecs.open(new_file_path, 'w', encoding='utf-8') as f: f.write(content) ``` 此方法能够从根本上解决问题,推荐优先使用[^3]。 ##### 方法三:设置系统默认编码为 GBK 可以通过修改环境变量或 Python 配置文件的方式,将系统默认编码设置为 GBK。例如,在 pytest 运行前设置以下环境变量: ```bash export PYTHONIOENCODING=gbk pytest ``` 或者在项目的 `pytest.ini` 文件中添加以下内容: ```ini [pytest] addopts = --tb=native python_files = *.py python_classes = Test* python_functions = test_* ``` 同时确保 pytest运行时正确加载了配置文件。 #### 3. **实验验证** 以下代码可用于测试不同编码方式对文件读取的影响: ```python for path in ["utf8File.txt", "gbkFile.txt"]: for encoding in [None, 'utf-8', 'gbk']: try: with open(path, encoding=encoding) as f: print(f.read()) break except UnicodeError as e: print(e) ``` 运行结果可以帮助确认文件的实际编码格式,并选择合适的解决方案。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值