Eli Bendersky <eli...@gmail.com> added the comment:

Terry,

""" When I tried the same fix in idlelib/PyShell.py, adding 'import subprocess' 
and changing
        self.rpcpid = os.spawnv(os.P_NOWAIT, sys.executable, args)
to
        self.rpcpid = subprocess.Popen(args).pid
(args begins with sys.executable) IDLE failed to start. The only evidence that 
it had been invoked was a brief (1/4 second?) appearance of 1 pythonw process 
in task manager. On a subsequent tries, without touching the file, I do not see 
even that. Is there any obvious mistake in the above? """

No, when I do the same, things seem to go fine. No zombie is left running after 
IDLE is closed, and even "Restart shell" works without leaving a zombie.

Maybe you had other modifications in your idlelib sources? 

Anyway, this wouldn't be a complete fix, because in:

    def unix_terminate(self):
        "UNIX: make sure subprocess is terminated and collect status"
        if hasattr(os, 'kill'):
            try:
                os.kill(self.rpcpid, SIGTERM)
            except OSError:
                # process already terminated:
                return
            else:
                try:
                    os.waitpid(self.rpcpid, 0)
                except OSError:
                    return

os.waitpid on Windows also expects a process handle, not pid. 

I think the complete solution, in addition to replacing os.spawnv by 
subprocess.Popen, would be to use Popen.kill and then Popen.wait instead of 
os.kill and then os.wait in the code above. This would require keeping the 
Popen object somewhere in self.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue12540>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to