Skip to content

Commit

Permalink
bpo-22536 [3.6] Set filename in FileNotFoundError (#3305)
Browse files Browse the repository at this point in the history
* [3.6] bpo-22536: Set the filename in FileNotFoundError. (GH-3194)

Have the subprocess module set the filename in the FileNotFoundError
exception raised on POSIX systems when the executable or cwd are missing.
(cherry picked from commit 8621bb5)

* bpo-22536 [3.6] (GH-3202) skip non-windows tests.
  • Loading branch information
gpshead authored Sep 4, 2017
1 parent 703fdb8 commit 1dba378
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 6 deletions.
12 changes: 6 additions & 6 deletions Lib/subprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -1328,15 +1328,15 @@ def _execute_child(self, args, executable, preexec_fn, close_fds,
child_exec_never_called = (err_msg == "noexec")
if child_exec_never_called:
err_msg = ""
# The error must be from chdir(cwd).
err_filename = cwd
else:
err_filename = orig_executable
if errno_num != 0:
err_msg = os.strerror(errno_num)
if errno_num == errno.ENOENT:
if child_exec_never_called:
# The error must be from chdir(cwd).
err_msg += ': ' + repr(cwd)
else:
err_msg += ': ' + repr(orig_executable)
raise child_exception_type(errno_num, err_msg)
err_msg += ': ' + repr(err_filename)
raise child_exception_type(errno_num, err_msg, err_filename)
raise child_exception_type(err_msg)


Expand Down
12 changes: 12 additions & 0 deletions Lib/test/test_subprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -1375,6 +1375,18 @@ def test_failed_child_execute_fd_leak(self):
fds_after_exception = os.listdir(fd_directory)
self.assertEqual(fds_before_popen, fds_after_exception)

@unittest.skipIf(mswindows, "behavior currently not supported on Windows")
def test_file_not_found_includes_filename(self):
with self.assertRaises(FileNotFoundError) as c:
subprocess.call(['/opt/nonexistent_binary', 'with', 'some', 'args'])
self.assertEqual(c.exception.filename, '/opt/nonexistent_binary')

@unittest.skipIf(mswindows, "behavior currently not supported on Windows")
def test_file_not_found_with_bad_cwd(self):
with self.assertRaises(FileNotFoundError) as c:
subprocess.Popen(['exit', '0'], cwd='/some/nonexistent/directory')
self.assertEqual(c.exception.filename, '/some/nonexistent/directory')


class RunFuncTestCase(BaseTestCase):
def run_python(self, code, **kwargs):
Expand Down
2 changes: 2 additions & 0 deletions Misc/NEWS.d/next/Library/2017-08-23.bpo-22536._narf_.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
The subprocess module now sets the filename when FileNotFoundError
is raised on POSIX systems due to the executable or cwd not being found.

0 comments on commit 1dba378

Please sign in to comment.