summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGregory P. Smith <greg@krypto.org>2017-08-24 21:58:25 (GMT)
committerGitHub <noreply@github.com>2017-08-24 21:58:25 (GMT)
commit8621bb5d93239316f97281826461b85072ff6db7 (patch)
tree84335831455c051084816564497bc5b7f549ec83
parentde50360ac2fec81dbf733f6c3c739b39a8822a39 (diff)
downloadcpython-8621bb5d93239316f97281826461b85072ff6db7.zip
cpython-8621bb5d93239316f97281826461b85072ff6db7.tar.gz
cpython-8621bb5d93239316f97281826461b85072ff6db7.tar.bz2
bpo-22536: Set the filename in FileNotFoundError. (#3194)
Have the subprocess module set the filename in the FileNotFoundError exception raised on POSIX systems when the executable or cwd are missing.
-rw-r--r--Lib/subprocess.py12
-rw-r--r--Lib/test/test_subprocess.py10
-rw-r--r--Misc/NEWS.d/next/Library/2017-08-23.bpo-22536._narf_.rst2
3 files changed, 18 insertions, 6 deletions
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index 2805ec3..bafb501 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -1327,15 +1327,15 @@ class Popen(object):
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)
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index c24fd1e..ac70597 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -1371,6 +1371,16 @@ class ProcessTestCase(BaseTestCase):
fds_after_exception = os.listdir(fd_directory)
self.assertEqual(fds_before_popen, fds_after_exception)
+ 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')
+
+ 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):
diff --git a/Misc/NEWS.d/next/Library/2017-08-23.bpo-22536._narf_.rst b/Misc/NEWS.d/next/Library/2017-08-23.bpo-22536._narf_.rst
new file mode 100644
index 0000000..bd238f9
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2017-08-23.bpo-22536._narf_.rst
@@ -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.