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.
This commit is contained in:
parent
6881886389
commit
273b766870
50
Lib/os.py
50
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,
|
*env* must be an environment variable dict or None. If *env* is None,
|
||||||
os.environ will be used.
|
os.environ will be used.
|
||||||
"""
|
"""
|
||||||
# Use a local import instead of a global import to avoid bootstrap issue:
|
# Use a local import instead of a global import to limit the number of
|
||||||
# the os module is used to build Python extensions.
|
# modules loaded at startup: the os module is always loaded at startup by
|
||||||
|
# Python. It may also avoid a bootstrap issue.
|
||||||
import warnings
|
import warnings
|
||||||
|
|
||||||
if env is None:
|
if env is None:
|
||||||
env = environ
|
env = environ
|
||||||
|
|
||||||
try:
|
# {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
|
||||||
# ignore BytesWarning warning
|
# BytesWarning when using python -b or python -bb: ignore the warning
|
||||||
with warnings.catch_warnings(record=True):
|
with warnings.catch_warnings():
|
||||||
path_list = env.get('PATH')
|
warnings.simplefilter("ignore", BytesWarning)
|
||||||
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:
|
|
||||||
try:
|
try:
|
||||||
# ignore BytesWarning warning
|
path_list = env.get('PATH')
|
||||||
with warnings.catch_warnings(record=True):
|
except TypeError:
|
||||||
path_listb = env[b'PATH']
|
path_list = None
|
||||||
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
|
|
||||||
|
|
||||||
if path_list is not None and isinstance(path_list, bytes):
|
if supports_bytes_environ:
|
||||||
path_list = fsdecode(path_list)
|
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:
|
if path_list is None:
|
||||||
path_list = defpath
|
path_list = defpath
|
||||||
|
|
Loading…
Reference in New Issue