mirror of
https://github.com/python/cpython.git
synced 2025-08-03 00:23:06 +00:00
bpo-35755: shutil.which() uses os.confstr("CS_PATH") (GH-12858)
shutil.which() and distutils.spawn.find_executable() now use os.confstr("CS_PATH") if available instead of os.defpath, if the PATH environment variable is not set. Don't use os.confstr("CS_PATH") nor os.defpath if the PATH environment variable is set to an empty string to mimick Unix 'which' command behavior. Changes: * find_executable() now starts by checking for the executable in the current working directly case. Add an explicit "if not path: return None". * Add tests for PATH='' (empty string), PATH=':' and for PATHEXT.
This commit is contained in:
parent
71ce03df9c
commit
228a3c99bd
5 changed files with 155 additions and 18 deletions
|
@ -87,11 +87,52 @@ class SpawnTestCase(support.TempdirManager,
|
|||
rv = find_executable(dont_exist_program , path=tmp_dir)
|
||||
self.assertIsNone(rv)
|
||||
|
||||
# test os.defpath: missing PATH environment variable
|
||||
# PATH='': no match, except in the current directory
|
||||
with test_support.EnvironmentVarGuard() as env:
|
||||
with mock.patch('distutils.spawn.os.defpath', tmp_dir):
|
||||
env.pop('PATH')
|
||||
env['PATH'] = ''
|
||||
with unittest.mock.patch('distutils.spawn.os.confstr',
|
||||
return_value=tmp_dir, create=True), \
|
||||
unittest.mock.patch('distutils.spawn.os.defpath',
|
||||
tmp_dir):
|
||||
rv = find_executable(program)
|
||||
self.assertIsNone(rv)
|
||||
|
||||
# look in current directory
|
||||
with test_support.change_cwd(tmp_dir):
|
||||
rv = find_executable(program)
|
||||
self.assertEqual(rv, program)
|
||||
|
||||
# PATH=':': explicitly looks in the current directory
|
||||
with test_support.EnvironmentVarGuard() as env:
|
||||
env['PATH'] = os.pathsep
|
||||
with unittest.mock.patch('distutils.spawn.os.confstr',
|
||||
return_value='', create=True), \
|
||||
unittest.mock.patch('distutils.spawn.os.defpath', ''):
|
||||
rv = find_executable(program)
|
||||
self.assertIsNone(rv)
|
||||
|
||||
# look in current directory
|
||||
with test_support.change_cwd(tmp_dir):
|
||||
rv = find_executable(program)
|
||||
self.assertEqual(rv, program)
|
||||
|
||||
# missing PATH: test os.confstr("CS_PATH") and os.defpath
|
||||
with test_support.EnvironmentVarGuard() as env:
|
||||
env.pop('PATH', None)
|
||||
|
||||
# without confstr
|
||||
with unittest.mock.patch('distutils.spawn.os.confstr',
|
||||
side_effect=ValueError,
|
||||
create=True), \
|
||||
unittest.mock.patch('distutils.spawn.os.defpath',
|
||||
tmp_dir):
|
||||
rv = find_executable(program)
|
||||
self.assertEqual(rv, filename)
|
||||
|
||||
# with confstr
|
||||
with unittest.mock.patch('distutils.spawn.os.confstr',
|
||||
return_value=tmp_dir, create=True), \
|
||||
unittest.mock.patch('distutils.spawn.os.defpath', ''):
|
||||
rv = find_executable(program)
|
||||
self.assertEqual(rv, filename)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue