问题描述
我正在开发一个使用 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 (将#修改为@)