Согласно docs :
Вы можете сделать это легко, pathlib.PurePath(*pathsegments)
"Каждый элемент pathsegments может быть либо строкой, представляющей сегмент пути, объект, реализующий интерфейс os.PathLike, который возвращает строку, или другой объект пути. "
>>> PurePath('foo', 'some/path', 'bar')
PurePosixPath('foo/some/path/bar')
>>> PurePath(Path('foo'), Path('bar'))
PurePosixPath('foo/bar')
Итак, для вас это будет:
pathA = pathlib.Path('source/parent')
pathB = pathlib.Path('child/grandchild')
pathAB = pathlib.PurePath(pathA, pathB)
Output: source/parent/child/grandchild
Примечание
"Когда задано несколько абсолютных путей, последний берется в качестве привязки (имитируя os.path.join () ' s): "
>>> PurePath('/etc', '/usr', 'lib64')
PurePosixPath('/usr/lib64')
>>> PureWindowsPath('c:/Windows', 'd:bar')
PureWindowsPath('d:bar')
Даже если вы сделаете это:
pathA = pathlib.Path('/source/parent')
pathB = pathlib.Path('/child/grandchild')
pathAB = pathlib.PurePath(pathA, pathB)
Pathlib будет обрабатывать pathB как объект пути, представленный строка.
Output: source/child/grandchild