views:

291

answers:

1

When I try to kill a process in windows with the subprocess.Popen.terminate() or kill() commands, I get an access denied error. I really need a cross-platform way to terminate the process if the file no longer exists (Yes, I know it's not the most elegant way of doing what I'm doing), I don't want to have to use platform calls or import win32api if at all possible.

Also - Once I kill the task, I should be able to just delete the iteration of that portion of the library, no? (I remember reading something about having to use slice if I plan on working on something and modifying it while working on it?)

#/usr/bin/env python
#import sys
import time
import os
import subprocess
import platform

ServerRange = range(7878, 7890)  #Range of ports you want your server to use.
cmd = 'VoiceChatterServer.exe'

#********DO NOT EDIT BELOW THIS LINE*******

def Start_IfConfExist(i):
    if os.path.exists(str(i) + ".conf"):
        Process[i] = subprocess.Popen(" " + cmd + " --config " + str(i) + ".conf", shell=True)

Process = {}

for i in ServerRange:
    Start_IfConfExist(i)

while True:
    for i in ServerRange:
        if os.path.exists(str(i) + ".conf"):
            res = Process[i].poll()
        if not os.path.exists(str(i) + ".conf"):  #This is the problem area
            res = Process[i].terminate()          #This is the problem area.
        if res is not None:
            Start_IfConfExist(i)
            print "\nRestarting: " + str(i) + "\n"
    time.sleep(1)
+2  A: 

You can easily make a platform independent call by doing something trivial like:

try:
    import win32
    def kill(param):
     # the code from S.Lotts link
except ImportError:
    def kill(param):
     # the unix way

Why this doesn't exist in python by default I don't know, but there are very similar problems in other areas like file change notifications where it really isn't that hard to make a platform independent lib (or at least win+mac+linux). I guess it's open source so you have to fix it yourself :P

boxed
Yeah, it actually kind of baffled me as well. There really should be a standard way of killing a process by passing the PID in win/linux/osx
ThantiK
The risk with that method, for Windows anyway, is that it will kill the shell but not the child process, unless the sudden lack of console for stdin/out/err makes it crash - that's exactly what I observe on my system. That means the child process will switch to the root Explorer as parent instead of the shell, and possibly still consume and block resources. Conclusion: don't use `shell=True` if the process has to be killed.
RedGlyph
Again, I have no choice in the matter. The executable I am running cannot be run without a console. If I set shell to false, I get all sorts of python errors about __init_ not happening correctly, etc
ThantiK