Commit 903de14e authored by Serhiy Storchaka's avatar Serhiy Storchaka

Merge heads

parents 7c140e2b 41ce0e93
...@@ -12,7 +12,9 @@ ...@@ -12,7 +12,9 @@
pair: UNIX; I/O control pair: UNIX; I/O control
This module performs file control and I/O control on file descriptors. It is an 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 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 argument. This can be an integer file descriptor, such as returned by
......
...@@ -190,6 +190,11 @@ Module functions and constants ...@@ -190,6 +190,11 @@ Module functions and constants
any combination of :const:`PARSE_DECLTYPES` and :const:`PARSE_COLNAMES` to turn any combination of :const:`PARSE_DECLTYPES` and :const:`PARSE_COLNAMES` to turn
type detection on. 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 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 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* :func:`connect` use your class instead by providing your class for the *factory*
......
...@@ -10,10 +10,10 @@ ...@@ -10,10 +10,10 @@
pair: POSIX; I/O control pair: POSIX; I/O control
pair: tty; I/O control pair: tty; I/O control
This module provides an interface to the POSIX calls for tty I/O control. For a 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 complete description of these calls, see :manpage:`termios(2)` Unix manual
only available for those Unix versions that support POSIX *termios* style tty page. It is only available for those Unix versions that support POSIX
I/O control (and then only if configured at installation time). *termios* style tty I/O control configured during installation.
All functions in this module take a file descriptor *fd* as their first 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 argument. This can be an integer file descriptor, such as returned by
......
...@@ -372,9 +372,11 @@ class SubprocessError(Exception): pass ...@@ -372,9 +372,11 @@ class SubprocessError(Exception): pass
class CalledProcessError(SubprocessError): class CalledProcessError(SubprocessError):
"""This exception is raised when a process run by check_call() or """Raised when a check_call() or check_output() process returns non-zero.
check_output() returns a non-zero exit status.
The exit status will be stored in the returncode attribute; 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. check_output() will also store the output in the output attribute.
""" """
def __init__(self, returncode, cmd, output=None, stderr=None): def __init__(self, returncode, cmd, output=None, stderr=None):
...@@ -384,7 +386,16 @@ class CalledProcessError(SubprocessError): ...@@ -384,7 +386,16 @@ class CalledProcessError(SubprocessError):
self.stderr = stderr self.stderr = stderr
def __str__(self): 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 @property
def stdout(self): def stdout(self):
......
...@@ -1427,6 +1427,27 @@ class POSIXProcessTestCase(BaseTestCase): ...@@ -1427,6 +1427,27 @@ class POSIXProcessTestCase(BaseTestCase):
p.wait() p.wait()
self.assertEqual(-p.returncode, signal.SIGABRT) 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): def test_preexec(self):
# DISCLAIMER: Setting environment variables is *not* a good use # DISCLAIMER: Setting environment variables is *not* a good use
# of a preexec_fn. This is merely a test. # of a preexec_fn. This is merely a test.
......
...@@ -22,6 +22,9 @@ Core and Builtins ...@@ -22,6 +22,9 @@ Core and Builtins
Library 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 - Issue #25931: Don't define socketserver.Forking* names on platforms such
as Windows that do not support os.fork(). as Windows that do not support os.fork().
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment