Python Prozess beenden

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Mestapholes
User
Beiträge: 1
Registriert: Mittwoch 16. April 2008, 10:52

Hallo,
ich habe folgendes Problem:
Ich starte ein Python Script aus VC++ per CreateProcess.
Dieser läuft dann in einem Cmd Fenster.
Das funktioniert soweit auch, aber leider wird das Fenster am Ende nicht geschlossen. Ich habe den Eindruck das der Python Interpreter noch weiterläuft (wird im Taskmanager auch noch angezeigt).
Wenn ich in dem Fenster Ctrl+C drücke wird dieser anscheinend geschlossen und das Fenster wird dann auch geschlossen.
Da ich mich mit Python nicht so wirklich auskenne würde ich hier mal gerne den (etwas gekürzten) Python Code posten und fragen ob ich am Code noch etwas ändern kann damit der Python Prozess auch beendet wird.

Für Hilfe wäre ich dankbar.
Grüsse
Christian

Code: Alles auswählen

class _SimulationBridge(wxPySimpleApp):
    def OnInit(self):
        wxBeginBusyCursor()
        try:
            simserverconn = SimulationServerConnection()

            print "Checking Parameters"
            len = missing_parameters(simserverconn)
            if(len !=0):
                return false;
            print "Starting Simulation"
            try:
                simid = simserverconn.rpc.simulation.start(sys.argv[2],sys.argv[3],sys.argv[4],int(sys.argv[5]))           
                    
            except:
                raise RuntimeError('ModelError:8511:%s' % sys.exc_info()[1])
        finally:
            wxEndBusyCursor()

        myframe = wxFrame(NULL, -1, "Simulating")
        myframe.Show(true)
        dlg = wxProgressDialog('Simulation Status: '+"Test", 'Initializing ...',
                               101, myframe, wxPD_CAN_ABORT | wxPD_APP_MODAL | wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME | \
                               wxPD_REMAINING_TIME)
                               
        proceed = 1
        prev_status = ('initializing', 'Initializing ...')
        try:
            while proceed:
                time.sleep(1)
               
...

                if status[0] == 'end_complete':
                    if prev_status[0] != status[0]:
                        dlg.Update(100, prev_status[1]) # show 100% done
                    sess = da_get_sess(sess_id, '%')[0]
                    results = da_get_res(sess.res_id)[0]
            
                if status[0] == 'end_error':
                    msg = "Model System Error: 8513\n"
                          "No new results available." % status[1]
                    msgdlg = wxMessageDialog(myframe, msg, 'Simulation', wxOK | wxICON_INFORMATION)
                    msgdlg.ShowModal()
                    msgdlg.Destroy()
                    proceed = 0
                if status[0] == 'end_stopped':
                    msg = 'The simulation has been stopped cleanly.'
                    msgdlg = wxMessageDialog(myframe, msg, 'Simulation', wxOK | wxICON_INFORMATION)
                    msgdlg.ShowModal()
                    msgdlg.Destroy()                    
                    proceed = 0
        finally:
            dlg.Destroy()
            myframe.Close() 
            sys.exit()        
            return true
            
if __name__ == "__main__":  
   app = _SimulationBridge()
   app.MainLoop()     
dark-lion
User
Beiträge: 46
Registriert: Mittwoch 25. April 2012, 14:22

Probier mal:

Code: Alles auswählen

import os
os.system("taskkill /process")
Process steht hierbei für python.exe/pythonw.exe
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@dark-lion: Was soll dem OP das nützen? Er will doch kein externes Python-Script beenden, sondern dass das vorhandene sich selber sauber beendet! Zudem sollte man `os.system` nicht unbedingt benutzen, wo es doch mittlerweile das `subprocess`-Modul gibt.

@Mestapholes: Ich bin nicht wx erfahren, aber der Code sieht mir ziemlich krude aus... im Grunde genommen kommst Du aus dem Programm wohl nur im `finally`-Zweig heraus. Ob das mal so gewollt ist? Du kannst das Programm ja auch alleine starten - wie verhält es sich denn dann? Kann man es denn da sauber beenden? (Oder tut es das gar von alleine?) Oder gibt es dort schon Probleme?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
dark-lion
User
Beiträge: 46
Registriert: Mittwoch 25. April 2012, 14:22

Hyperion hat geschrieben:@dark-lion: Was soll dem OP das nützen? Er will doch kein externes Python-Script beenden, sondern dass das vorhandene sich selber sauber beendet!
In dem fall würde sys.exit() genügen, oder?
Antworten