commit 9d54db62a7b918c3bc6a852275adaf70dfdfef44 Author: Damian Johnson atagar@torproject.org Date: Fri Jun 22 09:14:20 2012 -0700
Subprocess lacks a kill() method on python 2.5
The Popen.kill() ad Popen.terminate() methods were first added in python 2.6... http://docs.python.org/library/subprocess.html#subprocess.Popen.kill
We can work around this with os.kill() but that only works on *nix... http://stackoverflow.com/questions/552423/use-python-2-6-subprocess-module-i... --- stem/process.py | 18 ++++++++++++++++-- test/integ/process.py | 18 +++++++++++++++++- 2 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/stem/process.py b/stem/process.py index 36ef7b9..e9d453e 100644 --- a/stem/process.py +++ b/stem/process.py @@ -23,6 +23,7 @@ import signal import tempfile import subprocess
+import stem.prereq import stem.util.system
NO_TORRC = "<no torrc>" @@ -80,7 +81,15 @@ def launch_tor(tor_cmd = "tor", args = None, torrc_path = None, completion_perce try: os.remove(temp_file) except: pass
- tor_process.kill() + # We can't kill the subprocess on python 2.5 running Windows without the + # win32process module... + # http://stackoverflow.com/questions/552423/use-python-2-6-subprocess-module-i... + + if stem.prereq.is_python_26(): + tor_process.kill() + elif stem.util.system.is_windows(): + os.kill(tor_process.pid, signal.SIGTERM) + raise OSError("reached a %i second timeout without success" % timeout)
signal.signal(signal.SIGALRM, timeout_handler) @@ -95,7 +104,12 @@ def launch_tor(tor_cmd = "tor", args = None, torrc_path = None, completion_perce
# this will provide empty results if the process is terminated if not init_line: - tor_process.kill() # ... but best make sure + # ... but best make sure + if stem.prereq.is_python_26(): + tor_process.kill() + elif stem.util.system.is_windows(): + os.kill(tor_process.pid, signal.SIGTERM) + raise OSError("Process terminated: %s" % last_problem)
# provide the caller with the initialization message if they want it diff --git a/test/integ/process.py b/test/integ/process.py index e3dd277..2037d93 100644 --- a/test/integ/process.py +++ b/test/integ/process.py @@ -2,12 +2,16 @@ Tests the stem.process functions with various use cases. """
+import os import time +import signal import unittest
+import stem.prereq import stem.socket import stem.process import test.runner +import stem.util.system
class TestProcess(unittest.TestCase): def test_launch_tor_with_config(self): @@ -15,6 +19,10 @@ class TestProcess(unittest.TestCase): Exercises launch_tor_with_config. """
+ if not stem.prereq.is_python_26() and stem.util.system.is_windows(): + test.runner.skip("(unable to kill subprocesses)") + return + if test.runner.only_run_once(self, "test_launch_tor_with_config"): return
# Launch tor without a torrc, but with a control port. Confirms that this @@ -37,13 +45,21 @@ class TestProcess(unittest.TestCase): self.assertEquals("ControlPort=2778", str(getconf_response)) finally: if control_socket: control_socket.close() - tor_process.kill() + + if stem.prereq.is_python_26(): + tor_process.kill() + elif stem.util.system.is_windows(): + os.kill(tor_process.pid, signal.SIGTERM)
def test_launch_tor_with_timeout(self): """ Runs launch_tor where it times out before completing. """
+ if not stem.prereq.is_python_26() and stem.util.system.is_windows(): + test.runner.skip("(unable to kill subprocesses)") + return + if test.runner.only_run_once(self, "test_launch_tor_with_timeout"): return
start_time = time.time()
tor-commits@lists.torproject.org