diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2014-02-19 21:27:37 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2014-02-19 21:27:37 (GMT) |
commit | 2ac9d3110898a1cfc779dd436f05cd6ac231cbb3 (patch) | |
tree | b62d200630b8675414e833a7f1200cd424cf7ebe /Lib/posixpath.py | |
parent | c77d4ba85b4d2f08b4de094bc9d9104113772374 (diff) | |
download | cpython-2ac9d3110898a1cfc779dd436f05cd6ac231cbb3.zip cpython-2ac9d3110898a1cfc779dd436f05cd6ac231cbb3.tar.gz cpython-2ac9d3110898a1cfc779dd436f05cd6ac231cbb3.tar.bz2 |
Issue #6815: os.path.expandvars() now supports non-ASCII Unicode environment
variables names and values.
Diffstat (limited to 'Lib/posixpath.py')
-rw-r--r-- | Lib/posixpath.py | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/Lib/posixpath.py b/Lib/posixpath.py index d65dc75..0378004 100644 --- a/Lib/posixpath.py +++ b/Lib/posixpath.py @@ -285,28 +285,43 @@ def expanduser(path): # Non-existent variables are left unchanged. _varprog = None +_uvarprog = None def expandvars(path): """Expand shell variables of form $var and ${var}. Unknown variables are left unchanged.""" - global _varprog + global _varprog, _uvarprog if '$' not in path: return path - if not _varprog: - import re - _varprog = re.compile(r'\$(\w+|\{[^}]*\})') + if isinstance(path, _unicode): + if not _varprog: + import re + _varprog = re.compile(r'\$(\w+|\{[^}]*\})') + varprog = _varprog + encoding = sys.getfilesystemencoding() + else: + if not _uvarprog: + import re + _uvarprog = re.compile(_unicode(r'\$(\w+|\{[^}]*\})'), re.UNICODE) + varprog = _uvarprog + encoding = None i = 0 while True: - m = _varprog.search(path, i) + m = varprog.search(path, i) if not m: break i, j = m.span(0) name = m.group(1) if name.startswith('{') and name.endswith('}'): name = name[1:-1] + if encoding: + name = name.encode(encoding) if name in os.environ: tail = path[j:] - path = path[:i] + os.environ[name] + value = os.environ[name] + if encoding: + value = value.decode(encoding) + path = path[:i] + value i = len(path) path += tail else: |