带有日志记录和单击的 Pytest 仅在 Docker 中因 ValueError 失败

问题描述

我正在开发一个使用 Click 的库。它包含在 Docker 映像中。我正在尝试使用 click.testing.CliRunner 使用 pytest 对其进行测试。我正在使用 logging 写入日志,并且我已指定这些日志应在 pyproject.toml 中发出。当我的代码中出现异常时,并且仅在 Docker 中,我从 Click 中得到以下异常:

/opt/conda/lib/python3.8/site-packages/click/testing.py:434: ValueError
            except Exception as e:
                if not catch_exceptions:
                    raise
                exception = e
                exit_code = 1
                exc_info = sys.exc_info()
            finally:
                sys.stdout.flush()
>               stdout = outstreams[0].getvalue()
E               ValueError: I/O operation on closed file.

/opt/conda/lib/python3.8/site-packages/click/testing.py:434: ValueError

我已设法最低限度地重现此问题。我的代码看起来像这样:

import logging,click

logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)

@click.command()
@click.argument('value')
def main(value):
    logger.info(value)
    raise RuntimeError()

我的测试如下:

import pytest
from click.testing import CliRunner

from main import main

def test_main():
    runner = CliRunner()
    runner.invoke(main,['hello'],catch_exceptions=False)
    assert True

而我的 pyproject.toml 是:

[tool.pytest.ini_options]
log_cli = true
log_level = "INFO"

删除日志记录、CliRunner 或 pytest(即直接运行 test_main)不会触发 ValueError,并且 RuntimeError 是唯一引发的异常。在 Docker 容器之外运行它也不会引发 ValueError

我怎样才能避免这个错误

代码可在 a GitHub repo 上复制。我在 continuum/miniconda3 容器中重现了这个问题。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)