Python coverage subprocess coverage.process_startup() error

Viewed 456

Python version 3.7.5, coverage 5.0.3.

Trying to learn, how to measure coverage on subprocess, I created a little project, consisting of 3 files.

main.py:

import subprocess
import coverage
coverage.process_startup()
subprocess.run(['python', 'subprocess_script.py'])

subprocess_script.py:

print('123')

.coveragerc:

[run]
branch = True
data_file = coverage-data-new
source = .

Environment variable "COVERAGE_PROCESS_START" links to .coveragerc in this project.

After executing coverage run main.py, I get this error:

C:\Users\Kirill.Brusinets\PycharmProjects\test_subprocess_coverage>coverage run main.py
123
self._collectors:
  <Collector at 0x2f75f48: CTracer>
           _run_module_as_main : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\runpy.py:193
                     _run_code : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\runpy.py:85
                      <module> : C:\Users\Kirill.Brusinets\AppData\Local\Programs\Python\Python37\Scripts\coverage.exe\__main__.py:9
                          main : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\cmdline.py:828
                  command_line : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\cmdline.py:555
                        do_run : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\cmdline.py:700
                         start : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\control.py:518
               _init_for_start : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\control.py:449
                      __init__ : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\collector.py:111
  <Collector at 0x2fede08: CTracer>
           _run_module_as_main : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\runpy.py:193
                     _run_code : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\runpy.py:85
                      <module> : C:\Users\Kirill.Brusinets\AppData\Local\Programs\Python\Python37\Scripts\coverage.exe\__main__.py:9
                          main : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\cmdline.py:828
                  command_line : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\cmdline.py:555
                        do_run : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\cmdline.py:703
                           run : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\execfile.py:247
                      <module> : main.py:3
               process_startup : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\control.py:1094
                         start : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\control.py:518
               _init_for_start : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\control.py:449
                      __init__ : c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\collector.py:111
Traceback (most recent call last):
  File "c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\Kirill.Brusinets\AppData\Local\Programs\Python\Python37\Scripts\coverage.exe\__main__.py", line 9, in <module>
  File "c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\cmdline.py", line 828, in main
    status = CoverageScript().command_line(argv)
  File "c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\cmdline.py", line 555, in command_line
    return self.do_run(options, args)
  File "c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\cmdline.py", line 708, in do_run
    self.coverage.stop()
  File "c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\control.py", line 542, in stop
    self._collector.stop()
  File "c:\users\kirill.brusinets\appdata\local\programs\python\python37\lib\site-packages\coverage\collector.py", line 333, in stop
    "Expected current collector to be %r, but it's %r" % (self, self._collectors[-1])
AssertionError: Expected current collector to be <Collector at 0x2f75f48: CTracer>, but it's <Collector at 0x2fede08: CTracer>

If I put coverage.process_startup() into subprocess_script.py, I dont get any errors, but coverage is measured only on main.py. How to make it work?

1 Answers

subprocess.run(['python', 'subprocess_script.py']) starts a new sub-process. It has no relation with what you did in your pycharm. When you start the coverage, the coverage listens on the same interpreter. The subprocess creates a new interpreter outside the current execution environment. So your coverage can never listen another interpreter.

Why do you want to run it as subprocess? Alternate solution could be importing the subprocess_script into the main script and call the executable functions.

Related