I am wondering whether I have misunderstood the semantics of os.path relpath or whether it has a bug.

Here is a short test program:

-----------------------------------------------------------
from os.path import relpath, split

src_path = 'C:\\lib\\src\\'

vcx_path = 'C:\\build.vs22\\lib\\lib.vcxproj'
rel_path = relpath(src_path, vcx_path)
print(f"{vcx_path = }\n{src_path = }\n{rel_path = }\n")

vcx_path = 'C:\\build.vs22\\lib\\'
rel_path = relpath(src_path, vcx_path)
print(f"{vcx_path = }\n{src_path = }\n{rel_path = }\n")

vcx_path = 'C:\\build.vs22\\lib\\lib.vcxproj'
rel_path = relpath(src_path, split(vcx_path)[0])
print(f"{vcx_path = }\n{src_path = }\n{rel_path = }\n")
-----------------------------------------------------------

and its output with Python 3.11:

-----------------------------------------------------------
vcx_path = 'C:\\build.vs22\\lib\\lib.vcxproj'
src_path = 'C:\\lib\\src\\'
rel_path = '..\\..\\..\\lib\\src'

vcx_path = 'C:\\build.vs22\\lib\\'
src_path = 'C:\\lib\\src\\'
rel_path = '..\\..\\lib\\src'

vcx_path = 'C:\\build.vs22\\lib\\lib.vcxproj'
src_path = 'C:\\lib\\src\\'
rel_path = '..\\..\\lib\\src'
-----------------------------------------------------------

The first of these three results produces an incorrect relative path because relpath does not strip off any non-directory tails before comparing paths.

Is this a bug or my misunderstanding of relpath semantics?

Comments would be appreciated as I don't waste developer time if this is not a bug.

  regards

    Brian
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to