Merge heads
This commit is contained in:
commit
2e7cb1eda9
|
@ -12,7 +12,9 @@
|
|||
pair: UNIX; I/O control
|
||||
|
||||
This module performs file control and I/O control on file descriptors. It is an
|
||||
interface to the :c:func:`fcntl` and :c:func:`ioctl` Unix routines.
|
||||
interface to the :c:func:`fcntl` and :c:func:`ioctl` Unix routines. For a
|
||||
complete description of these calls, see :manpage:`fcntl(2)` and
|
||||
:manpage:`ioctl(2)` Unix manual pages.
|
||||
|
||||
All functions in this module take a file descriptor *fd* as their first
|
||||
argument. This can be an integer file descriptor, such as returned by
|
||||
|
|
|
@ -190,6 +190,11 @@ Module functions and constants
|
|||
any combination of :const:`PARSE_DECLTYPES` and :const:`PARSE_COLNAMES` to turn
|
||||
type detection on.
|
||||
|
||||
By default, *check_same_thread* is :const:`True` and only the creating thread may
|
||||
use the connection. If set :const:`False`, the returned connection may be shared
|
||||
across multiple threads. When using multiple threads with the same connection
|
||||
writing operations should be serialized by the user to avoid data corruption.
|
||||
|
||||
By default, the :mod:`sqlite3` module uses its :class:`Connection` class for the
|
||||
connect call. You can, however, subclass the :class:`Connection` class and make
|
||||
:func:`connect` use your class instead by providing your class for the *factory*
|
||||
|
|
|
@ -11,9 +11,9 @@
|
|||
pair: tty; I/O control
|
||||
|
||||
This module provides an interface to the POSIX calls for tty I/O control. For a
|
||||
complete description of these calls, see the POSIX or Unix manual pages. It is
|
||||
only available for those Unix versions that support POSIX *termios* style tty
|
||||
I/O control (and then only if configured at installation time).
|
||||
complete description of these calls, see :manpage:`termios(2)` Unix manual
|
||||
page. It is only available for those Unix versions that support POSIX
|
||||
*termios* style tty I/O control configured during installation.
|
||||
|
||||
All functions in this module take a file descriptor *fd* as their first
|
||||
argument. This can be an integer file descriptor, such as returned by
|
||||
|
|
|
@ -372,9 +372,11 @@ class SubprocessError(Exception): pass
|
|||
|
||||
|
||||
class CalledProcessError(SubprocessError):
|
||||
"""This exception is raised when a process run by check_call() or
|
||||
check_output() returns a non-zero exit status.
|
||||
The exit status will be stored in the returncode attribute;
|
||||
"""Raised when a check_call() or check_output() process returns non-zero.
|
||||
|
||||
The exit status will be stored in the returncode attribute, negative
|
||||
if it represents a signal number.
|
||||
|
||||
check_output() will also store the output in the output attribute.
|
||||
"""
|
||||
def __init__(self, returncode, cmd, output=None, stderr=None):
|
||||
|
@ -384,7 +386,16 @@ class CalledProcessError(SubprocessError):
|
|||
self.stderr = stderr
|
||||
|
||||
def __str__(self):
|
||||
return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode)
|
||||
if self.returncode and self.returncode < 0:
|
||||
try:
|
||||
return "Command '%s' died with %r." % (
|
||||
self.cmd, signal.Signals(-self.returncode))
|
||||
except ValueError:
|
||||
return "Command '%s' died with unknown signal %d." % (
|
||||
self.cmd, -self.returncode)
|
||||
else:
|
||||
return "Command '%s' returned non-zero exit status %d." % (
|
||||
self.cmd, self.returncode)
|
||||
|
||||
@property
|
||||
def stdout(self):
|
||||
|
|
|
@ -1427,6 +1427,27 @@ class POSIXProcessTestCase(BaseTestCase):
|
|||
p.wait()
|
||||
self.assertEqual(-p.returncode, signal.SIGABRT)
|
||||
|
||||
def test_CalledProcessError_str_signal(self):
|
||||
err = subprocess.CalledProcessError(-int(signal.SIGABRT), "fake cmd")
|
||||
error_string = str(err)
|
||||
# We're relying on the repr() of the signal.Signals intenum to provide
|
||||
# the word signal, the signal name and the numeric value.
|
||||
self.assertIn("signal", error_string.lower())
|
||||
# We're not being specific about the signal name as some signals have
|
||||
# multiple names and which name is revealed can vary.
|
||||
self.assertIn("SIG", error_string)
|
||||
self.assertIn(str(signal.SIGABRT), error_string)
|
||||
|
||||
def test_CalledProcessError_str_unknown_signal(self):
|
||||
err = subprocess.CalledProcessError(-9876543, "fake cmd")
|
||||
error_string = str(err)
|
||||
self.assertIn("unknown signal 9876543.", error_string)
|
||||
|
||||
def test_CalledProcessError_str_non_zero(self):
|
||||
err = subprocess.CalledProcessError(2, "fake cmd")
|
||||
error_string = str(err)
|
||||
self.assertIn("non-zero exit status 2.", error_string)
|
||||
|
||||
def test_preexec(self):
|
||||
# DISCLAIMER: Setting environment variables is *not* a good use
|
||||
# of a preexec_fn. This is merely a test.
|
||||
|
|
|
@ -22,6 +22,9 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #27167: Clarify the subprocess.CalledProcessError error message text
|
||||
when the child process died due to a signal.
|
||||
|
||||
- Issue #25931: Don't define socketserver.Forking* names on platforms such
|
||||
as Windows that do not support os.fork().
|
||||
|
||||
|
|
Loading…
Reference in New Issue