¿Hay alguna manera de finalizar un proceso iniciado con el subproceso. ¿Clase Popen con el argumento "shell" establecido en "True"? En el ejemplo mínimo de trabajo a continuación (utiliza wxPython) puede abrir y finalizar un proceso de Bloc de notas felizmente; sin embargo, si cambia el argumento "shell" de Popen a "True", el proceso de Bloc de notas no finaliza.Python 2.6 en Windows: cómo terminar subproceso.Popen con argumento "shell = True"?
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()
Acepte, por el bien de esta pregunta, que "shell" tiene que ser igual a "Verdadero".
¿Qué versión de Python? –
relacionado: [Cómo finalizar un subproceso de python iniciado con shell = True] (http: // stackoverflow.com/questions/4789837/how-to-terminate-a-python-subprocess-launch-with-shell-true) – jfs