Kaydet (Commit) 273b7668 authored tarafından Victor Stinner's avatar Victor Stinner

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.
üst 68818863
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment