You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Coverage无法统计被终止子进程的覆盖率问题排查

子进程被终止时coverage无法统计其覆盖率的问题

我在Linux环境下使用Python 3.7.1(因环境限制必须使用该旧版本)和coverage 7.2.7,尝试统计包含subprocess的代码覆盖率,但仅能获取主进程的覆盖率,子进程的覆盖率无法被统计。

主进程代码(main.py)

#!/usr/bin/env python3

import os
import subprocess


process = subprocess.Popen(["python3", "child.py"],
                           stdout=subprocess.PIPE,
                           stderr=subprocess.STDOUT)

i = 0
for line in process.stdout:
    line = line.decode().rstrip()
    print(line)

    if i < 10:
        i += 1
    else:
        break

process.terminate()
process.wait()

子进程代码(child.py)

#!/usr/bin/env python3

import sys
import time
import random

while True:
    time.sleep(1)
    print(random.randint(0, 10), flush=True)

已完成的配置操作

我已按照coverage官方文档配置:

  1. 创建.coveragerc配置文件,内容如下:
[run]
branch = True
parallel = True
concurrency = thread, multiprocessing

(尝试过添加/移除concurrency配置,均无效果)
2. 设置环境变量COVERAGE_PROCESS_START指向该.coveragerc文件
3. 在site目录配置sitecustomize.py,内容如下:

import coverage
coverage.process_startup()

已确认该文件在子进程启动时会被执行

运行现象

通过coverage run main.py运行主进程,再执行coverage combine和coverage report生成报告,但报告中仅显示主进程的覆盖率:

Name      Stmts   Miss Branch BrPart  Cover
-------------------------------------------
main.py      12      0      4      1    94%
-------------------------------------------
TOTAL        12      0      4      1    94%

执行combine前仅能看到一个coverage.*文件,正常情况下应至少存在2个。

补充信息

若让子进程通过循环计数器提前正常结束,覆盖率统计即可正常工作。因此我判断coverage未处理子进程被终止的场景,尽管文档说明其应支持atexit()和SIGTERM,且已验证子进程会收到主进程terminate()发送的SIGTERM信号。

我已查阅相关问题仍未解决,请问问题出在哪里?

内容的提问来源于stack exchange,提问作者Steven Dickinson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:17:17