2017-10-11 2 views
0

Ich habe einen kleinen Python-app, die ich pyInstaller auf verwendet, um eine exe-Datei zu erstellen:Wie zu zwingen, meinen Python-made exe beenden

import subprocess 

try: 
    taskCommand = 'tasklist /FI "ImageName eq pc-client.exe"' 
    reply = subprocess.Popen(taskCommand, stdout = subprocess.PIPE).communicate()[0] 
    for line in reply.split("\n"): 
     if line.startswith("pc-client.exe"): 
      PID = line.split()[1] 
      print PID 
except: 
    pass 

try: 
    killCommand = ("TASKKILL /f /t /PID " + PID) 
    subprocess.Popen(killCommand, stdout = subprocess.PIPE).communicate()[0] 
except: 
    pass 

try: 
    print "Restarting Papercut Client..." 
    subprocess.Popen(r"\\server\path\to\file\filename.exe", stdout = subprocess.PIPE).communicate()[0] 
except: 
    pass 

sys.exit() 

Wenn die exe ausgeführt werden, öffnet es in den Fenstern Befehlsfenster, wird seinen Code ausführen (es ist nicht interaktiv) und dann möchte ich das Fenster verschwinden, wenn es fertig ist!

Was sollte ich am Ende meines Python-Code setzen, um das Fenster zu schließen, wenn es abgeschlossen ist. Ich habe versucht os.quit(), os._exit(), sys.quit() & sys.exit(), aber keiner von ihnen tatsächlich das Fenster zu schließen!

Wie ich eine Exe von meinem Code erstellen, sollte ich etwas anderes verwenden? Ich kann nicht mit dem NOCONSOLE Flag kompiliert, wie es sie braucht, um tatsächlich die Befehle ausführen ...

Dank.

Antwort

0

können Sie die Windows-Eingabeaufforderung blockieren überhaupt von der Tür durch

setzen
console=False 

in Spec-Datei. Zum Beispiel:

exe = EXE(pyz, 
     a.scripts, 
     exclude_binaries=True, 
     name='YourApp', 
     console=False, 
     icon='IMGFolder\game_icon_cs6_icon.ico') 

Wenn Sie von der Kommandozeile ohne eine Spec-Datei ausgeführt wird, verwenden Sie die NOCONSOLE Flagge:

pyinstaller.py --noconsole yourscript.py 

für weitere Informationen über die PyInstaller Optionen: https://pyinstaller.readthedocs.io/en/stable/usage.html#options

Wenn Sie will die Eingabeaufforderung dann hochkommen, sys.exit() funktioniert für mich, aber ohne mehr Code zu sehen, wird es schwer zu sagen sein.

UPDATE

Seit Teilprozesse beteiligt sind, beachten Sie, dass die Eingabeaufforderung geöffnet bleibt, bis alle Prozesse (Eltern und Kind) gelöst werden.

Es sieht aus wie Sie die erste Aufgabe mit seinem PID töten werden (ich würde aus dem PID drucken, bevor Sie es töten Sie das Richtige muss bestätigen). Dann führen Sie die zweite Aufgabe aus (die Hauptdatei, die Sie ausführen möchten), aber nie töten.

Versuchen Sie, die Eingabeaufforderung zu schließen, aber die EXE-Ausführung fortzusetzen?

Es gibt einige gute Informationen ist es, Prozesse zu töten hier: How to kill a python child process created with subprocess.check_output() when the parent dies?

+0

Ach, das macht Sinn ... So kann ich den übergeordneten Prozess (mein Code), wenn das Kind Prozess (die .exe) abzutöten hat begonnen lass es laufen? – user3514446

+0

Ja, aber das Befehlsfenster wird nicht verschwinden, weil Sie die exe "von der Eingabeaufforderung" über einen Unterprozessaufruf erzeugt haben. Es sei denn, ich vermisse etwas oder interpretiere das Ziel falsch. – The4thIceman