You are right on the money. 

The solution I did... kinda smells to me. But here is what is happening.

in python2.7 os.path.relpath even when passed in two unicode objects will return a string object. This happens because in some cases the function will return a byte string. Looking at posixpath.py this is because the function will sometimes return hardcoded paths that are hardcoded as bytestring.

Open to a cleaner solution, but this seems to be the situation.

```
# strings representing various path-related bits and pieces
curdir = '.'
pardir = '..'
extsep = '.'
sep = '/'
pathsep = ':'
defpath = ':/bin:/usr/bin'
altsep = None
devnull = '/dev/null'

...

def relpath(path, start=curdir):
    """Return a relative version of a path"""

    if not path:
        raise ValueError("no path specified")

    start_list = [x for x in abspath(start).split(sep) if x]
    path_list = [x for x in abspath(path).split(sep) if x]

    # Work out how much of the filepath is shared by start and path.
    i = len(commonprefix([start_list, path_list]))

    rel_list = [pardir] * (len(start_list)-i) + path_list[i:]
    if not rel_list:
        return curdir
    return join(*rel_list)
```