Skip to content

os.path.relpath fails when saving a coverage file with coverage 5 in a folder from a different Windows drive #895

@ogrisel

Description

@ogrisel

Describe the bug

In the scikit-learn test suite we have a test that launches a subprocess and the atexit registry triggers the saving of a coverage file in a tempfolder in d:\ while the current working directory has been changed by pytest --pyargs to c:\ in the meantime.

E                   AssertionError: Error in atexit._run_exitfuncs:
E                   Traceback (most recent call last):
E                     File "c:\miniconda\envs\testvenv\lib\ntpath.py", line 562, in relpath
E                       path_drive, start_drive))
E                   ValueError: path is on mount 'D:', start on mount 'c:'

cmd        = ['c:\\miniconda\\envs\\testvenv\\python.exe', 'C:\\Users\\VSSADM~1\\AppData\\Local\\Temp\\tmp32ajt78f_src_test_sklearn.py']
coverage_rc = None
cwd        = 'c:\\miniconda\\envs\\testvenv\\lib\\site-packages'
...

I do not understand why the traceback starts at atexit._run_exitfuncs and then goes to ntpath.relpath directly without going through the function of the coverage module. I suspect that the culprit is:

https://github.com/nedbat/coveragepy/blob/coverage-5.0/coverage/sqldata.py#L982

When rolling back to coverage 4.5.3, the problem disappears.

To Reproduce

This problems happens with coverage 5.0 and Python 3.7.5 with the latest pytest and pytest-cov.

It seems tricky to reproduce, in particular I do not understand why this only happens in the subprocess tests of scikit-learn and never in the main process itself. Maybe the current working directory is restored to the d:\ tempfolder prior to writing the coverage files?

Anyhow the details can be found in the CI logs of this pull request where I have patched the ntpath.relpath function to display more debug info:

scikit-learn/scikit-learn#15909

I will open a PR to fix the issue in coveragepy.

It looks similar to #824 but the error message is actually different.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions