Issue #10210: os.get_exec_path() ignores BytesWarning warnings

This commit is contained in:
Victor Stinner 2010-10-29 00:38:58 +00:00
parent bfd7b265b6
commit 6f35eda4d9
2 changed files with 20 additions and 3 deletions

View File

@ -382,18 +382,32 @@ 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:
# the os module is used to build Python extensions.
import warnings
if env is None: if env is None:
env = environ env = environ
try: try:
# ignore BytesWarning warning
with warnings.catch_warnings(record=True):
path_list = env.get('PATH') path_list = env.get('PATH')
except (TypeError, 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 path_list = None
if supports_bytes_environ: if supports_bytes_environ:
try: try:
# ignore BytesWarning warning
with warnings.catch_warnings(record=True):
path_listb = env[b'PATH'] path_listb = env[b'PATH']
except (KeyError, TypeError, BytesWarning): 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 pass
else: else:
if path_list is not None: if path_list is not None:

View File

@ -461,8 +461,11 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol):
if os.supports_bytes_environ: if os.supports_bytes_environ:
# env cannot contain 'PATH' and b'PATH' keys # env cannot contain 'PATH' and b'PATH' keys
try: try:
# ignore BytesWarning warning
with warnings.catch_warnings(record=True):
mixed_env = {'PATH': '1', b'PATH': b'2'} mixed_env = {'PATH': '1', b'PATH': b'2'}
except BytesWarning: except BytesWarning:
# mixed_env cannot be created with python -bb
pass pass
else: else:
self.assertRaises(ValueError, os.get_exec_path, mixed_env) self.assertRaises(ValueError, os.get_exec_path, mixed_env)