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
overrides the value of the *invalidation_mode* argument, and determines
its default value instead.
+ .. versionchanged:: 3.8
+ The *quiet* parameter was added.
+
.. class:: PycInvalidationMode
(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
------
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.
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.
_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:
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:
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__":
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,
--- /dev/null
+:func:`py_compile.compile` now supports silent mode.
+Patch by Joannah Nanjekye
\ No newline at end of file