Python 2.6.6 的 Pytest 版本

Pytest version for Python 2.6.6

我正在尝试在 Python 2.6.6 RHEL 6.10 上设置 pytest。

正如 official change log 中所指出的,pytest 3.3.0 不支持 python 2.6,因此应考虑 pytest < 3.3。我可以成功安装 pytest=3.2.5,但是当我执行简单测试时出现以下错误:

Traceback (most recent call last):
  File "/usr/lib64/python2.6/runpy.py", line 122, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib64/python2.6/runpy.py", line 34, in _run_code
    exec code in run_globals
  File "/usr/lib/python2.6/site-packages/pytest.py", line 17, in <module>
    raise SystemExit(pytest.main())
  File "/usr/lib/python2.6/site-packages/_pytest/config.py", line 57, in main
    return config.hook.pytest_cmdline_main(config=config)
  File "/usr/lib/python2.6/site-packages/_pytest/vendored_packages/pluggy.py", line 745, in __call__
    return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
  File "/usr/lib/python2.6/site-packages/_pytest/vendored_packages/pluggy.py", line 339, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "/usr/lib/python2.6/site-packages/_pytest/vendored_packages/pluggy.py", line 334, in <lambda>
    _MultiCall(methods, kwargs, hook.spec_opts).execute()
  File "/usr/lib/python2.6/site-packages/_pytest/vendored_packages/pluggy.py", line 614, in execute
    res = hook_impl.function(*args)
  File "/usr/lib/python2.6/site-packages/_pytest/main.py", line 127, in pytest_cmdline_main
    return wrap_session(config, _main)
  File "/usr/lib/python2.6/site-packages/_pytest/main.py", line 111, in wrap_session
    config.notify_exception(excinfo, config.option)
  File "/usr/lib/python2.6/site-packages/_pytest/config.py", line 936, in notify_exception
    excinfo=excinfo)
  File "/usr/lib/python2.6/site-packages/_pytest/vendored_packages/pluggy.py", line 745, in __call__
    return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
  File "/usr/lib/python2.6/site-packages/_pytest/vendored_packages/pluggy.py", line 339, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "/usr/lib/python2.6/site-packages/_pytest/vendored_packages/pluggy.py", line 334, in <lambda>
    _MultiCall(methods, kwargs, hook.spec_opts).execute()
  File "/usr/lib/python2.6/site-packages/_pytest/vendored_packages/pluggy.py", line 614, in execute
    res = hook_impl.function(*args)
  File "/usr/lib/python2.6/site-packages/_pytest/terminal.py", line 163, in pytest_internalerror
    for line in py.builtin.text(excrepr).split("\n"):
  File "/usr/lib/python2.6/site-packages/_pytest/_code/code.py", line 664, in __unicode__
    self.toterminal(tw)
  File "/usr/lib/python2.6/site-packages/_pytest/_code/code.py", line 709, in toterminal
    self.reprtraceback.toterminal(tw)
  File "/usr/lib/python2.6/site-packages/_pytest/_code/code.py", line 725, in toterminal
    entry.toterminal(tw)
  File "/usr/lib/python2.6/site-packages/_pytest/_code/code.py", line 748, in toterminal
    tw.write("".join(self.lines))
  File "/usr/lib/python2.6/site-packages/py/_io/terminalwriter.py", line 250, in write
    self._update_chars_on_current_line(msg)
  File "/usr/lib/python2.6/site-packages/py/_io/terminalwriter.py", line 262, in _update_chars_on_current_line
    current_line = current_line.decode('utf-8', errors='replace')
TypeError: decode() takes no keyword arguments


快速搜索表明 decode() 在 python 2.7 中接受参数。 如果这是依赖的情况,那么 Python 2.6.6 推荐使用哪个版本的 pytest?

pytest==3.2.5 是仍然支持 Python 2.6 的版本,但是仅仅因为 pytest==3.2.5 支持 Python 2.6,并不一定意味着它的依赖项作为setup.py 中指定的库作者支持 Python 2.6.

大多数软件包使用 greater-than 约束来指定它们的依赖关系,例如libxxx>=1.2.3,以确保当依赖库作者发布它们时,您将自动获得更新版本的依赖项,但您永远不会下载不兼容的旧版本。在大多数情况下,这很好,因为它减少了库作者的工作量,但这意味着如果该依赖库发布了一个较新的版本,该版本放弃了对依赖库仍然支持的特定版本的支持,您将把它拉进来,因为没有 less-than 约束来防止这种情况。

在这种情况下,根据您显示的回溯,提取的 py.io 库不支持 python 2.6。您需要降级并将 py.io 固定到仍支持 2.6 的旧版本。

根据py.io changelog,最后一个仍然支持Python 2.6的版本是py.io==1.4.34.

如果支持旧软件对您很重要,您应该创建一个 requirements.txt 文件来冻结依赖项列表,而不是依赖软件包的自动版本解析。