diff --git a/src/doc/en/reference/interfaces/index.rst b/src/doc/en/reference/interfaces/index.rst index d007f6778f3..f09fc6218e6 100644 --- a/src/doc/en/reference/interfaces/index.rst +++ b/src/doc/en/reference/interfaces/index.rst @@ -108,7 +108,6 @@ and testing to make sure nothing funny is going on). sage/interfaces/tachyon sage/interfaces/tides - sage/interfaces/cleaner sage/interfaces/quit sage/interfaces/read_data diff --git a/src/sage/interfaces/expect.py b/src/sage/interfaces/expect.py index 6076e38d0c7..6f83c4ef4f5 100644 --- a/src/sage/interfaces/expect.py +++ b/src/sage/interfaces/expect.py @@ -48,7 +48,6 @@ import time import gc from . import quit -from . import cleaner from random import randrange import pexpect @@ -515,7 +514,7 @@ def _start(self, alt_message=None, block_during_init=True): os.chdir(currentdir) if self._do_cleaner(): - cleaner.cleaner(self._expect.pid, cmd) + quit.register_spawned_process(self._expect.pid, cmd) try: self._expect.expect(self._prompt) diff --git a/src/sage/interfaces/qsieve.py b/src/sage/interfaces/qsieve.py index a9e40cc1b6a..aff8ef1c165 100644 --- a/src/sage/interfaces/qsieve.py +++ b/src/sage/interfaces/qsieve.py @@ -129,7 +129,7 @@ def data_to_list(out, n, time): from sage.interfaces.sagespawn import SageSpawn import pexpect -from . import cleaner +from . import quit class qsieve_nonblock: """ A non-blocking version of Hart's quadratic sieve. @@ -165,7 +165,7 @@ def __init__(self, n, time): env = os.environ.copy() env['TMPDIR'] = tmp_dir('qsieve') self._p = SageSpawn(cmd, env=env) - cleaner.cleaner(self._p.pid, 'QuadraticSieve') + quit.register_spawned_process(self._p.pid, 'QuadraticSieve') self._p.sendline(str(self._n)+'\n\n\n') self._done = False self._out = '' diff --git a/src/sage/interfaces/quit.py b/src/sage/interfaces/quit.py index e8c669afe21..e40e54de07b 100644 --- a/src/sage/interfaces/quit.py +++ b/src/sage/interfaces/quit.py @@ -13,8 +13,27 @@ import os -expect_objects = [] +import atexit, tempfile +_spd = tempfile.TemporaryDirectory() +SAGE_SPAWNED_PROCESS_FILE = os.path.join(_spd.name, "spawned_processes") +atexit.register(lambda: _spd.cleanup()) + +def register_spawned_process(pid, cmd=''): + """ + Write a line to the ``spawned_processes`` file with the given + ``pid`` and ``cmd``. + """ + if cmd != '': + cmd = cmd.strip().split()[0] + # This is safe, since only this process writes to this file. + try: + with open(SAGE_SPAWNED_PROCESS_FILE, 'a') as o: + o.write('%s %s\n'%(pid, cmd)) + except IOError: + pass + +expect_objects = [] def expect_quitall(verbose=False): """ @@ -63,8 +82,6 @@ def kill_spawned_jobs(verbose=False): sage: sage.interfaces.quit.expect_quitall() """ - from sage.interfaces.cleaner import SAGE_SPAWNED_PROCESS_FILE - if not os.path.exists(SAGE_SPAWNED_PROCESS_FILE): return with open(SAGE_SPAWNED_PROCESS_FILE) as f: diff --git a/src/sage/interfaces/rubik.py b/src/sage/interfaces/rubik.py index 263b85c58a5..d8cad1dc8e4 100644 --- a/src/sage/interfaces/rubik.py +++ b/src/sage/interfaces/rubik.py @@ -34,7 +34,7 @@ import pexpect import time -from . import cleaner +from . import quit from sage.cpython.string import bytes_to_str from sage.groups.perm_gps.cubegroup import index2singmaster @@ -108,7 +108,7 @@ def __init__(self, verbose=False, wait=True): def start(self): child = pexpect.spawn(self.__cmd) - cleaner.cleaner(child.pid, self.__cmd) + quit.register_spawned_process(child.pid, self.__cmd) child.timeout = None self.child = child self._ready = False