From 273b7668704c97db1fa36e45eded391a73c5e73f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 6 Nov 2010 12:59:33 +0000 Subject: os.get_exec_path() ignores BytesWarning instead of recoding them Use only one global warning.catch_warnings() context, instead of two local contexts. Improve also the explaination why the function uses a local import. --- Lib/os.py | 52 ++++++++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/Lib/os.py b/Lib/os.py index cdc2a66..5848d74 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -382,41 +382,37 @@ def get_exec_path(env=None): *env* must be an environment variable dict or None. If *env* is None, os.environ will be used. """ - # Use a local import instead of a global import to avoid bootstrap issue: - # the os module is used to build Python extensions. + # Use a local import instead of a global import to limit the number of + # modules loaded at startup: the os module is always loaded at startup by + # Python. It may also avoid a bootstrap issue. import warnings if env is None: env = environ - try: - # ignore BytesWarning warning - with warnings.catch_warnings(record=True): - path_list = env.get('PATH') - except (TypeError, BytesWarning): - # A BytesWarning here means that env has a b'PATH' key, but no 'PATH' - # key. Compare bytes and str raises a BytesWarning exception only if - # sys.flags.bytes_warning==2, and in this case it is not possible to - # create a dictionary with both keys. - path_list = None - - if supports_bytes_environ: + # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a + # BytesWarning when using python -b or python -bb: ignore the warning + with warnings.catch_warnings(): + warnings.simplefilter("ignore", BytesWarning) + try: - # ignore BytesWarning warning - with warnings.catch_warnings(record=True): - path_listb = env[b'PATH'] - except (KeyError, TypeError, BytesWarning): - # A BytesWarning here means that env has a 'PATH' key, but no - # b'PATH' key. See the comment above for an explaination. - pass - else: - if path_list is not None: - raise ValueError( - "env cannot contain 'PATH' and b'PATH' keys") - path_list = path_listb + path_list = env.get('PATH') + except TypeError: + path_list = None - if path_list is not None and isinstance(path_list, bytes): - path_list = fsdecode(path_list) + if supports_bytes_environ: + try: + path_listb = env[b'PATH'] + except (KeyError, TypeError): + pass + else: + if path_list is not None: + raise ValueError( + "env cannot contain 'PATH' and b'PATH' keys") + path_list = path_listb + + if path_list is not None and isinstance(path_list, bytes): + path_list = fsdecode(path_list) if path_list is None: path_list = defpath -- cgit v0.12