Esiste un modo per terminare un processo avviato con la sottoprocesso. Classe di classe con l'argomento "shell" impostato su "True"? Nell'esempio di lavoro minimo qui di seguito (utilizza wxPython) è possibile aprire e chiudere un processo di Blocco note in modo soddisfacente, tuttavia se si modifica l'argomento "shell" di Popen su "True", il processo di Blocco note non viene terminato.Python 2.6 su Windows: come terminare subprocess.Popen con argomento "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()
Si prega di accettare per il gusto di questa domanda che "shell" deve essere uguale a "True".
Quale versione di Python? –
related: [Come terminare un sottoprocesso python lanciato con shell = True] (http: // stackoverflow.it/questions/4789837/how-to-terminate-a-python-subprocess-launch-with-shell-true) – jfs