[Python-checkins] bpo-22640: Add silent mode to py_compile.compile() (GH-12976)

Berker Peksag webhook-mailer at python.org
Tue May 28 12:29:08 EDT 2019


https://github.com/python/cpython/commit/2e33ecd7c9b0cac3efc6fcbdd4547fd086b4e2d1
commit: 2e33ecd7c9b0cac3efc6fcbdd4547fd086b4e2d1
branch: master
author: Joannah Nanjekye <33177550+nanjekyejoannah at users.noreply.github.com>
committer: Berker Peksag <berker.peksag at gmail.com>
date: 2019-05-28T19:29:04+03:00
summary:

bpo-22640: Add silent mode to py_compile.compile() (GH-12976)

files:
A Misc/NEWS.d/next/Library/2019-04-26-22-13-26.bpo-22640.p3rheW.rst
M Doc/library/py_compile.rst
M Doc/whatsnew/3.8.rst
M Lib/py_compile.py
M Lib/test/test_py_compile.py

diff --git a/Doc/library/py_compile.rst b/Doc/library/py_compile.rst
index 8cb5a4d546c8..3824353abda1 100644
--- a/Doc/library/py_compile.rst
+++ b/Doc/library/py_compile.rst
@@ -42,6 +42,13 @@ byte-code cache files in the directory containing the source code.
    is raised.  This function returns the path to byte-compiled file, i.e.
    whatever *cfile* value was used.
 
+   The *doraise* and *quiet* arguments determine how errors are handled while
+   compiling file. If *quiet* is 0 or 1, and *doraise* is false, the default
+   behaviour is enabled: an error string is written to ``sys.stderr``, and the
+   function returns ``None`` instead of a path. If *doraise* is true,
+   a :exc:`PyCompileError` is raised instead. However if *quiet* is 2,
+   no message is written, and *doraise* has no effect.
+
    If the path that *cfile* becomes (either explicitly specified or computed)
    is a symlink or non-regular file, :exc:`FileExistsError` will be raised.
    This is to act as a warning that import will turn those paths into regular
@@ -82,6 +89,9 @@ byte-code cache files in the directory containing the source code.
       overrides the value of the *invalidation_mode* argument, and determines
       its default value instead.
 
+   .. versionchanged:: 3.8
+      The *quiet* parameter was added.
+
 
 .. class:: PycInvalidationMode
 
diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst
index b32cec1edaca..aaa6ffe1abdf 100644
--- a/Doc/whatsnew/3.8.rst
+++ b/Doc/whatsnew/3.8.rst
@@ -537,6 +537,13 @@ NSKeyedArchiver-encoded binary plists.
 (Contributed by Jon Janzen in :issue:`26707`.)
 
 
+py_compile
+----------
+
+:func:`py_compile.compile` now supports silent mode.
+(Contributed by Joannah Nanjekye in :issue:`22640`.)
+
+
 socket
 ------
 
diff --git a/Lib/py_compile.py b/Lib/py_compile.py
index 8e9dd57a5440..21736896afc2 100644
--- a/Lib/py_compile.py
+++ b/Lib/py_compile.py
@@ -77,7 +77,7 @@ def _get_default_invalidation_mode():
 
 
 def compile(file, cfile=None, dfile=None, doraise=False, optimize=-1,
-            invalidation_mode=None):
+            invalidation_mode=None, quiet=0):
     """Byte-compile one Python source file to Python bytecode.
 
     :param file: The source file name.
@@ -95,6 +95,8 @@ def compile(file, cfile=None, dfile=None, doraise=False, optimize=-1,
         are -1, 0, 1 and 2.  A value of -1 means to use the optimization
         level of the current interpreter, as given by -O command line options.
     :param invalidation_mode:
+    :param quiet: Return full output with False or 0, errors only with 1,
+        and no output with 2.
 
     :return: Path to the resulting byte compiled file.
 
@@ -143,11 +145,12 @@ def compile(file, cfile=None, dfile=None, doraise=False, optimize=-1,
                                      _optimize=optimize)
     except Exception as err:
         py_exc = PyCompileError(err.__class__, err, dfile or file)
-        if doraise:
-            raise py_exc
-        else:
-            sys.stderr.write(py_exc.msg + '\n')
-            return
+        if quiet < 2:
+            if doraise:
+                raise py_exc
+            else:
+                sys.stderr.write(py_exc.msg + '\n')
+        return
     try:
         dirname = os.path.dirname(cfile)
         if dirname:
@@ -194,10 +197,12 @@ def main(args=None):
                 compile(filename, doraise=True)
             except PyCompileError as error:
                 rv = 1
-                sys.stderr.write("%s\n" % error.msg)
+                if quiet < 2:
+                    sys.stderr.write("%s\n" % error.msg)
             except OSError as error:
                 rv = 1
-                sys.stderr.write("%s\n" % error)
+                if quiet < 2:
+                    sys.stderr.write("%s\n" % error)
     else:
         for filename in args:
             try:
@@ -205,7 +210,8 @@ def main(args=None):
             except PyCompileError as error:
                 # return value to indicate at least one failure
                 rv = 1
-                sys.stderr.write("%s\n" % error.msg)
+                if quiet < 2:
+                    sys.stderr.write("%s\n" % error.msg)
     return rv
 
 if __name__ == "__main__":
diff --git a/Lib/test/test_py_compile.py b/Lib/test/test_py_compile.py
index f86abe26f97a..d6677ab45ff5 100644
--- a/Lib/test/test_py_compile.py
+++ b/Lib/test/test_py_compile.py
@@ -192,6 +192,15 @@ def test_invalidation_mode(self):
                 fp.read(), 'test', {})
         self.assertEqual(flags, 0b1)
 
+    def test_quiet(self):
+        bad_coding = os.path.join(os.path.dirname(__file__), 'bad_coding2.py')
+        with support.captured_stderr() as stderr:
+            self.assertIsNone(py_compile.compile(bad_coding, doraise=False, quiet=2))
+            self.assertIsNone(py_compile.compile(bad_coding, doraise=True, quiet=2))
+            self.assertEqual(stderr.getvalue(), '')
+            with self.assertRaises(py_compile.PyCompileError):
+                py_compile.compile(bad_coding, doraise=True, quiet=1)
+
 
 class PyCompileTestsWithSourceEpoch(PyCompileTestsBase,
                                     unittest.TestCase,
diff --git a/Misc/NEWS.d/next/Library/2019-04-26-22-13-26.bpo-22640.p3rheW.rst b/Misc/NEWS.d/next/Library/2019-04-26-22-13-26.bpo-22640.p3rheW.rst
new file mode 100644
index 000000000000..8ac6be920443
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-04-26-22-13-26.bpo-22640.p3rheW.rst
@@ -0,0 +1,2 @@
+:func:`py_compile.compile` now supports silent mode.  
+Patch by Joannah Nanjekye
\ No newline at end of file



More information about the Python-checkins mailing list