2010-01-20 6 views
6

Hey alle, habe ich ein Skript, das alsAnmutiges Beenden eines Programms in Python?

läuft
while True: 
    doStuff() 

Was ist der beste Weg ist, mit diesem Skript zu kommunizieren, wenn ich es stoppen müssen, aber ich will es nicht töten, wenn es in der ist mitten in einer Operation?

Danke!

Antwort

7

Der beste Weg ist, das Skript neu zu schreiben, so dass es while True: nicht verwendet.

Leider ist es unmöglich, eine gute Möglichkeit, dies zu beenden, zu vermuten.

Sie könnten die Linux-Signale verwenden.

Sie könnten einen Timer verwenden und nach einer Weile stoppen.

Sie könnten dostuff einen Wert zurückgeben und stoppen, wenn der Wert False ist.

Sie können nach einer lokalen Datei suchen und anhalten, wenn die Datei existiert.

Sie können eine FTP-Site für eine Remote-Datei überprüfen und das Stoppen der Datei besteht.

Sie können eine HTTP-Webseite nach Informationen durchsuchen, die angeben, ob Ihre Schleife angehalten werden soll oder nicht.

Sie könnten OS-spezifische Dinge wie Semaphore oder Shared Memory verwenden.

+0

danke für die schnelle Antwort, auf jeden Fall ein paar gute Ideen, an die ich nicht gedacht habe. – James

5

ich denke, die eleganteste wäre:

keep_running = true 
while keep_running: 
    dostufF() 

und dann kann dostuff()keep_running = false gesetzt, wenn in nicht mehr laufen will, dann die while-Schleife endet, und alles reinigt auf den Punkt.

2

Wenn das eine Konsolenanwendung ist und das Beenden durch Drücken von Strg + C OK ist, könnte das Ihr Problem lösen?

try: 
    while True: 
    doStuff() 
except KeyboardInterrupt: 
    doOtherStuff() 

Ich denke, das Problem mit diesem Ansatz ist, dass Sie keine Kontrolle genau haben würden, wann und wo in doStuff die Ausführung beendet.

7

Und ich nehme an, du meinst das Töten von außerhalb des Python-Skripts.

Die Art, wie ich am einfachsten gefunden habe, ist

@atexit.register 
def cleanup() 
    sys.unlink("myfile.%d" % os.getpid()) 

f = open("myfile.%d" % os.getpid(), "w") 
f.write("Nothing") 
f.close() 
while os.path.exists("myfile.%d" % os.getpid()): 
    doSomething() 

Dann wird das Skript zu beenden, nur die myfile.xxx entfernen und die Anwendung für Sie beenden sollte. Sie können dies auch verwenden, wenn mehrere Instanzen desselben Skripts gleichzeitig ausgeführt werden, wenn Sie nur einen herunterfahren müssen. Und es versucht nach sich selbst aufzuräumen ....

-1

Das Signalmodul kann Signale fangen und entsprechend reagieren?

Verwandte Themen