summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorChristian Heimes <christian@cheimes.de>2008-04-20 21:01:16 (GMT)
committerChristian Heimes <christian@cheimes.de>2008-04-20 21:01:16 (GMT)
commita342c013fc97df2110c420af2cd66b7e8489b9af (patch)
tree8e95e3309129066e84c3aa83bdbc7aaf087fbf62 /Lib
parent58f9e4f34793a14050648c9f620e96189908a3e9 (diff)
downloadcpython-a342c013fc97df2110c420af2cd66b7e8489b9af.zip
cpython-a342c013fc97df2110c420af2cd66b7e8489b9af.tar.gz
cpython-a342c013fc97df2110c420af2cd66b7e8489b9af.tar.bz2
Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r62386 | christian.heimes | 2008-04-19 04:23:57 +0200 (Sat, 19 Apr 2008) | 2 lines Added kill, terminate and send_signal to subprocess.Popen The bits and pieces for the Windows side were already in place. The POSIX side is trivial (as usual) and uses os.kill(). ........ r62387 | georg.brandl | 2008-04-19 10:23:59 +0200 (Sat, 19 Apr 2008) | 2 lines Fix-up docs for revision 62386. ........ r62389 | georg.brandl | 2008-04-19 18:57:43 +0200 (Sat, 19 Apr 2008) | 2 lines #2369: clarify that copyfile() doesn't take a target directory. ........ r62390 | georg.brandl | 2008-04-19 18:58:28 +0200 (Sat, 19 Apr 2008) | 2 lines #2634: clarify meaning of env parameter to spawn/exec*e. ........ r62391 | georg.brandl | 2008-04-19 18:58:49 +0200 (Sat, 19 Apr 2008) | 2 lines #2633: clarify meaning of env parameter. ........ r62392 | georg.brandl | 2008-04-19 18:59:16 +0200 (Sat, 19 Apr 2008) | 2 lines #2631: clarify IMPORT_NAME semantics. ........ r62393 | georg.brandl | 2008-04-19 19:00:14 +0200 (Sat, 19 Apr 2008) | 2 lines :func: et al. should *not* include the parens. ........ r62396 | mark.dickinson | 2008-04-19 20:51:48 +0200 (Sat, 19 Apr 2008) | 5 lines Additional tests for math.pow, and extra special-case handling code in math.pow, in the hope of making all tests pass on the alpha Tru64 buildbot. ........ r62400 | mark.dickinson | 2008-04-19 21:41:52 +0200 (Sat, 19 Apr 2008) | 3 lines Additional special-case handling for math.pow. Windows/VS2008 doesn't like (-1)**(+-inf). ........ r62401 | benjamin.peterson | 2008-04-19 21:47:34 +0200 (Sat, 19 Apr 2008) | 2 lines Complete documentation for errors argument of io's open and TextIOWrapper ........ r62402 | mark.dickinson | 2008-04-19 22:31:16 +0200 (Sat, 19 Apr 2008) | 2 lines Document updates to math and cmath modules. ........ r62407 | georg.brandl | 2008-04-19 23:28:38 +0200 (Sat, 19 Apr 2008) | 2 lines Update template for newest Sphinx. ........ r62409 | mark.dickinson | 2008-04-19 23:35:35 +0200 (Sat, 19 Apr 2008) | 5 lines Correct documentation for math.pow; 0**nan is nan, not 0. (But nan**0 and 1**nan are 1.) Also fix minor typo: 'quite NaN' -> 'quiet NaN' ........ r62410 | mark.dickinson | 2008-04-19 23:49:22 +0200 (Sat, 19 Apr 2008) | 4 lines Move asinh documentation to the proper place. Remove meaningless 'in radians' from inverse hyperbolic functions. ........ r62412 | mark.dickinson | 2008-04-20 03:22:30 +0200 (Sun, 20 Apr 2008) | 5 lines Report additional diagnostic information in test_math, to help track down debian-alpha buildbot failure. ........ r62413 | mark.dickinson | 2008-04-20 03:39:24 +0200 (Sun, 20 Apr 2008) | 3 lines FreeBSD doesn't follow C99 for modf(inf); so add explicit special-value handling to math.modf code. ........ r62414 | mark.dickinson | 2008-04-20 06:13:13 +0200 (Sun, 20 Apr 2008) | 5 lines Yet more explicit special case handling to make math.pow behave on alpha Tru64. All IEEE 754 special values are now handled directly; only the finite**finite case is handled by libm. ........ r62418 | mark.dickinson | 2008-04-20 18:13:17 +0200 (Sun, 20 Apr 2008) | 7 lines Issue 2662: Initialize special value tables dynamically (i.e. when cmath module is loaded) instead of statically. This fixes compile-time problems on platforms where HUGE_VAL is an extern variable rather than a constant. Thanks Hirokazu Yamamoto for the patch. ........ r62419 | andrew.kuchling | 2008-04-20 18:54:02 +0200 (Sun, 20 Apr 2008) | 1 line Move description of math module changes; various edits to description of cmath changes ........
Diffstat (limited to 'Lib')
-rw-r--r--Lib/subprocess.py32
-rw-r--r--Lib/test/test_math.py153
-rw-r--r--Lib/test/test_subprocess.py46
3 files changed, 220 insertions, 11 deletions
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index 5aee34d..d39eb19 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -290,6 +290,7 @@ import io
import os
import traceback
import gc
+import signal
# Exception classes used by this module.
class CalledProcessError(Exception):
@@ -317,6 +318,7 @@ if mswindows:
from win32process import CreateProcess, STARTUPINFO, \
GetExitCodeProcess, STARTF_USESTDHANDLES, \
STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE
+ from win32process import TerminateProcess
from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0
else:
from _subprocess import *
@@ -828,6 +830,21 @@ class Popen(object):
self.wait()
return (stdout, stderr)
+ def send_signal(self, sig):
+ """Send a signal to the process
+ """
+ if sig == signal.SIGTERM:
+ self.terminate()
+ else:
+ raise ValueError("Only SIGTERM is supported on Windows")
+
+ def terminate(self):
+ """Terminates the process
+ """
+ TerminateProcess(self._handle, 1)
+
+ kill = terminate
+
else:
#
# POSIX methods
@@ -1115,6 +1132,21 @@ class Popen(object):
self.wait()
return (stdout, stderr)
+ def send_signal(self, sig):
+ """Send a signal to the process
+ """
+ os.kill(self.pid, sig)
+
+ def terminate(self):
+ """Terminate the process with SIGTERM
+ """
+ self.send_signal(signal.SIGTERM)
+
+ def kill(self):
+ """Kill the process with SIGKILL
+ """
+ self.send_signal(signal.SIGKILL)
+
def _demo_posix():
#
diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py
index b8c23db..401fc1e 100644
--- a/Lib/test/test_math.py
+++ b/Lib/test/test_math.py
@@ -102,7 +102,7 @@ class MathTests(unittest.TestCase):
self.ftest('atan(0)', math.atan(0), 0)
self.ftest('atan(1)', math.atan(1), math.pi/4)
self.ftest('atan(inf)', math.atan(INF), math.pi/2)
- self.ftest('atan(-inf)', math.atan(-INF), -math.pi/2)
+ self.ftest('atan(-inf)', math.atan(NINF), -math.pi/2)
self.assert_(math.isnan(math.atan(NAN)))
def testAtanh(self):
@@ -383,14 +383,140 @@ class MathTests(unittest.TestCase):
self.assert_(math.isnan(math.pow(2, NAN)))
self.assert_(math.isnan(math.pow(0, NAN)))
self.assertEqual(math.pow(1, NAN), 1)
- self.assertEqual(1**NAN, 1)
- self.assertEqual(1**INF, 1)
- self.assertEqual(1**NINF, 1)
- self.assertEqual(1**0, 1)
- self.assertEqual(1.**NAN, 1)
- self.assertEqual(1.**INF, 1)
- self.assertEqual(1.**NINF, 1)
- self.assertEqual(1.**0, 1)
+
+ # pow(0., x)
+ self.assertEqual(math.pow(0., INF), 0.)
+ self.assertEqual(math.pow(0., 3.), 0.)
+ self.assertEqual(math.pow(0., 2.3), 0.)
+ self.assertEqual(math.pow(0., 2.), 0.)
+ self.assertEqual(math.pow(0., 0.), 1.)
+ self.assertEqual(math.pow(0., -0.), 1.)
+ self.assertRaises(ValueError, math.pow, 0., -2.)
+ self.assertRaises(ValueError, math.pow, 0., -2.3)
+ self.assertRaises(ValueError, math.pow, 0., -3.)
+ self.assertRaises(ValueError, math.pow, 0., NINF)
+ self.assert_(math.isnan(math.pow(0., NAN)))
+
+ # pow(INF, x)
+ self.assertEqual(math.pow(INF, INF), INF)
+ self.assertEqual(math.pow(INF, 3.), INF)
+ self.assertEqual(math.pow(INF, 2.3), INF)
+ self.assertEqual(math.pow(INF, 2.), INF)
+ self.assertEqual(math.pow(INF, 0.), 1.)
+ self.assertEqual(math.pow(INF, -0.), 1.)
+ self.assertEqual(math.pow(INF, -2.), 0.)
+ self.assertEqual(math.pow(INF, -2.3), 0.)
+ self.assertEqual(math.pow(INF, -3.), 0.)
+ self.assertEqual(math.pow(INF, NINF), 0.)
+ self.assert_(math.isnan(math.pow(INF, NAN)))
+
+ # pow(-0., x)
+ self.assertEqual(math.pow(-0., INF), 0.)
+ self.assertEqual(math.pow(-0., 3.), -0.)
+ self.assertEqual(math.pow(-0., 2.3), 0.)
+ self.assertEqual(math.pow(-0., 2.), 0.)
+ self.assertEqual(math.pow(-0., 0.), 1.)
+ self.assertEqual(math.pow(-0., -0.), 1.)
+ self.assertRaises(ValueError, math.pow, -0., -2.)
+ self.assertRaises(ValueError, math.pow, -0., -2.3)
+ self.assertRaises(ValueError, math.pow, -0., -3.)
+ self.assertRaises(ValueError, math.pow, -0., NINF)
+ self.assert_(math.isnan(math.pow(-0., NAN)))
+
+ # pow(NINF, x)
+ self.assertEqual(math.pow(NINF, INF), INF)
+ self.assertEqual(math.pow(NINF, 3.), NINF)
+ self.assertEqual(math.pow(NINF, 2.3), INF)
+ self.assertEqual(math.pow(NINF, 2.), INF)
+ self.assertEqual(math.pow(NINF, 0.), 1.)
+ self.assertEqual(math.pow(NINF, -0.), 1.)
+ self.assertEqual(math.pow(NINF, -2.), 0.)
+ self.assertEqual(math.pow(NINF, -2.3), 0.)
+ self.assertEqual(math.pow(NINF, -3.), -0.)
+ self.assertEqual(math.pow(NINF, NINF), 0.)
+ self.assert_(math.isnan(math.pow(NINF, NAN)))
+
+ # pow(-1, x)
+ self.assertEqual(math.pow(-1., INF), 1.)
+ self.assertEqual(math.pow(-1., 3.), -1.)
+ self.assertRaises(ValueError, math.pow, -1., 2.3)
+ self.assertEqual(math.pow(-1., 2.), 1.)
+ self.assertEqual(math.pow(-1., 0.), 1.)
+ self.assertEqual(math.pow(-1., -0.), 1.)
+ self.assertEqual(math.pow(-1., -2.), 1.)
+ self.assertRaises(ValueError, math.pow, -1., -2.3)
+ self.assertEqual(math.pow(-1., -3.), -1.)
+ self.assertEqual(math.pow(-1., NINF), 1.)
+ self.assert_(math.isnan(math.pow(-1., NAN)))
+
+ # pow(1, x)
+ self.assertEqual(math.pow(1., INF), 1.)
+ self.assertEqual(math.pow(1., 3.), 1.)
+ self.assertEqual(math.pow(1., 2.3), 1.)
+ self.assertEqual(math.pow(1., 2.), 1.)
+ self.assertEqual(math.pow(1., 0.), 1.)
+ self.assertEqual(math.pow(1., -0.), 1.)
+ self.assertEqual(math.pow(1., -2.), 1.)
+ self.assertEqual(math.pow(1., -2.3), 1.)
+ self.assertEqual(math.pow(1., -3.), 1.)
+ self.assertEqual(math.pow(1., NINF), 1.)
+ self.assertEqual(math.pow(1., NAN), 1.)
+
+ # pow(x, 0) should be 1 for any x
+ self.assertEqual(math.pow(2.3, 0.), 1.)
+ self.assertEqual(math.pow(-2.3, 0.), 1.)
+ self.assertEqual(math.pow(NAN, 0.), 1.)
+ self.assertEqual(math.pow(2.3, -0.), 1.)
+ self.assertEqual(math.pow(-2.3, -0.), 1.)
+ self.assertEqual(math.pow(NAN, -0.), 1.)
+
+ # pow(x, y) is invalid if x is negative and y is not integral
+ self.assertRaises(ValueError, math.pow, -1., 2.3)
+ self.assertRaises(ValueError, math.pow, -15., -3.1)
+
+ # pow(x, NINF)
+ self.assertEqual(math.pow(1.9, NINF), 0.)
+ self.assertEqual(math.pow(1.1, NINF), 0.)
+ self.assertEqual(math.pow(0.9, NINF), INF)
+ self.assertEqual(math.pow(0.1, NINF), INF)
+ self.assertEqual(math.pow(-0.1, NINF), INF)
+ self.assertEqual(math.pow(-0.9, NINF), INF)
+ self.assertEqual(math.pow(-1.1, NINF), 0.)
+ self.assertEqual(math.pow(-1.9, NINF), 0.)
+
+ # pow(x, INF)
+ self.assertEqual(math.pow(1.9, INF), INF)
+ self.assertEqual(math.pow(1.1, INF), INF)
+ self.assertEqual(math.pow(0.9, INF), 0.)
+ self.assertEqual(math.pow(0.1, INF), 0.)
+ self.assertEqual(math.pow(-0.1, INF), 0.)
+ self.assertEqual(math.pow(-0.9, INF), 0.)
+ self.assertEqual(math.pow(-1.1, INF), INF)
+ self.assertEqual(math.pow(-1.9, INF), INF)
+
+ # pow(x, y) should work for x negative, y an integer
+ self.ftest('(-2.)**3.', math.pow(-2.0, 3.0), -8.0)
+ self.ftest('(-2.)**2.', math.pow(-2.0, 2.0), 4.0)
+ self.ftest('(-2.)**1.', math.pow(-2.0, 1.0), -2.0)
+ self.ftest('(-2.)**0.', math.pow(-2.0, 0.0), 1.0)
+ self.ftest('(-2.)**-0.', math.pow(-2.0, -0.0), 1.0)
+ self.ftest('(-2.)**-1.', math.pow(-2.0, -1.0), -0.5)
+ self.ftest('(-2.)**-2.', math.pow(-2.0, -2.0), 0.25)
+ self.ftest('(-2.)**-3.', math.pow(-2.0, -3.0), -0.125)
+ self.assertRaises(ValueError, math.pow, -2.0, -0.5)
+ self.assertRaises(ValueError, math.pow, -2.0, 0.5)
+
+ # the following tests have been commented out since they don't
+ # really belong here: the implementation of ** for floats is
+ # independent of the implemention of math.pow
+ #self.assertEqual(1**NAN, 1)
+ #self.assertEqual(1**INF, 1)
+ #self.assertEqual(1**NINF, 1)
+ #self.assertEqual(1**0, 1)
+ #self.assertEqual(1.**NAN, 1)
+ #self.assertEqual(1.**INF, 1)
+ #self.assertEqual(1.**NINF, 1)
+ #self.assertEqual(1.**0, 1)
def testRadians(self):
self.assertRaises(TypeError, math.radians)
@@ -417,7 +543,7 @@ class MathTests(unittest.TestCase):
self.ftest('sinh(1)**2-cosh(1)**2', math.sinh(1)**2-math.cosh(1)**2, -1)
self.ftest('sinh(1)+sinh(-1)', math.sinh(1)+math.sinh(-1), 0)
self.assertEquals(math.sinh(INF), INF)
- self.assertEquals(math.sinh(-INF), -INF)
+ self.assertEquals(math.sinh(NINF), NINF)
self.assert_(math.isnan(math.sinh(NAN)))
def testSqrt(self):
@@ -555,7 +681,12 @@ class MathTests(unittest.TestCase):
# no real versions of rect, polar
continue
func = getattr(math, fn)
- result = func(ar)
+ try:
+ result = func(ar)
+ except ValueError:
+ message = ("Unexpected ValueError in " +
+ "test %s:%s(%r)\n" % (id, fn, ar))
+ self.fail(message)
self.ftest("%s:%s(%r)" % (id, fn, ar), result, er)
def test_main():
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index e6acce3..98a9e44 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -584,6 +584,29 @@ class ProcessTestCase(unittest.TestCase):
os.remove(fname)
self.assertEqual(rc, 47)
+ def test_send_signal(self):
+ p = subprocess.Popen([sys.executable,
+ "-c", "input()"])
+
+ self.assert_(p.poll() is None, p.poll())
+ p.send_signal(signal.SIGINT)
+ self.assertNotEqual(p.wait(), 0)
+
+ def test_kill(self):
+ p = subprocess.Popen([sys.executable,
+ "-c", "input()"])
+
+ self.assert_(p.poll() is None, p.poll())
+ p.kill()
+ self.assertEqual(p.wait(), -signal.SIGKILL)
+
+ def test_terminate(self):
+ p = subprocess.Popen([sys.executable,
+ "-c", "input()"])
+
+ self.assert_(p.poll() is None, p.poll())
+ p.terminate()
+ self.assertEqual(p.wait(), -signal.SIGTERM)
#
# Windows tests
@@ -655,6 +678,29 @@ class ProcessTestCase(unittest.TestCase):
' -c "import sys; sys.exit(47)"')
self.assertEqual(rc, 47)
+ def test_send_signal(self):
+ p = subprocess.Popen([sys.executable,
+ "-c", "input()"])
+
+ self.assert_(p.poll() is None, p.poll())
+ p.send_signal(signal.SIGTERM)
+ self.assertNotEqual(p.wait(), 0)
+
+ def test_kill(self):
+ p = subprocess.Popen([sys.executable,
+ "-c", "input()"])
+
+ self.assert_(p.poll() is None, p.poll())
+ p.kill()
+ self.assertNotEqual(p.wait(), 0)
+
+ def test_terminate(self):
+ p = subprocess.Popen([sys.executable,
+ "-c", "input()"])
+
+ self.assert_(p.poll() is None, p.poll())
+ p.terminate()
+ self.assertNotEqual(p.wait(), 0)
def test_main():
test_support.run_unittest(ProcessTestCase)