Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python 2.6 on Windows: how to terminate subprocess.Popen with "shell=True" argument?

Is there a way to terminate a process started with the subprocess.Popen class with the "shell" argument set to "True"? In the working minimal example below (uses wxPython) you can open and terminate a Notepad process happily, however if you change the Popen "shell" argument to "True" then the Notepad process doesn't terminate.

import wx
import threading
import subprocess

class MainWindow(wx.Frame):

    def __init__(self, parent, id, title):        
        wx.Frame.__init__(self, parent, id, title)
        self.main_panel = wx.Panel(self, -1)

        self.border_sizer = wx.BoxSizer()

        self.process_button = wx.Button(self.main_panel, -1, "Start process", (50, 50))
        self.process_button.Bind(wx.EVT_BUTTON, self.processButtonClick)

        self.border_sizer.Add(self.process_button)
        self.main_panel.SetSizerAndFit(self.border_sizer)
        self.Fit()

        self.Centre()
        self.Show(True)

    def processButtonClick(self, event):
        if self.process_button.GetLabel() == "Start process":
            self.process_button.SetLabel("End process")
            self.notepad = threading.Thread(target = self.runProcess)
            self.notepad.start()
        else:
            self.cancel = 1
            self.process_button.SetLabel("Start process")

    def runProcess(self):
        self.cancel = 0

        notepad_process = subprocess.Popen("notepad", shell = False)

        while notepad_process.poll() == None: # While process has not yet terminated.
            if self.cancel:
                notepad_process.terminate()
                break

def main():
    app = wx.PySimpleApp()
    mainView = MainWindow(None, wx.ID_ANY, "test")
    app.MainLoop()

if __name__ == "__main__":
    main()

Please accept for the sake of this question that "shell" does have to equal "True".

like image 593
Wayne Koorts Avatar asked Mar 30 '09 07:03

Wayne Koorts


1 Answers

Why are you using shell=True?

Just don't do it. You don't need it, it invokes the shell and that is useless.

I don't accept it has to be True, because it doesn't. Using shell=True only brings you problems and no benefit. Just avoid it at all costs. Unless you're running some shell internal command, you don't need it, ever.

like image 80
nosklo Avatar answered Sep 25 '22 06:09

nosklo