Popen
läuft asynchron standardmäßig. Das Objekt Popen
kann später gespeichert und abgefragt werden.
p = subproccess.Popen(executable)
# continue with other work
p.poll() # returns None if p is still running, returncode otherwise
p.terminate() # closes the process forcefully
p.wait() # freezes the execution until process finishes - makes it synchronous
alles, was benötigt wird, ist p
irgendwo zu speichern, bis ihr Status überprüft werden muss, z.B. in einer globalen Liste gestarteter Prozesse, wenn es keinen besseren Ort gibt.
UPDATE
Das Problem scheint zu sein, wie eine Datei zu öffnen, geben Sie es an Popen
und schließen Sie die Datei, wenn der Prozess abgeschlossen ist, ohne irgendwelche Referenzen zu halten.
def run_process(executable, filename):
with open(filename, 'w') as f:
subprocess.Popen(executable, stdout=f).wait()
Thread(target=run_process, args=(executable, filename)).start()
Run es und vergessen Sie es:
Dies kann einfach mit einem Gewinde erfolgen. run_process
wird eingefroren, bis der Prozess beendet ist und dann wird die Datei geschlossen, aber das alles passiert in einem anderen Thread.
Hinweis: Sie möglicherweise oder nicht egal, was mit dem Thread oder dem Prozess passiert, wenn sie nicht fertig sind, wenn der Django-Prozess abgeschlossen ist.
Um dies zu handhaben, könnten Sie einen komplexeren Thread erstellen, an den Sie sich erinnern würden, und ihn vor dem Beenden von django stoppen. es kann auch den Prozess schließen oder darauf warten, dass es beendet wird ...
Ich weiß es läuft Asynchron standardmäßig bedeuten, dass ich, wenn ich es tue stdout = f wobei f ein Python-Datei-Objekt, was passiert, wenn Python die Datei des Referenzrahmen verläßt, während die subprocess noch läuft? –
@DylanLawrence Ach das! Die Datei bleibt geöffnet, bis Sie sie schließen (verwenden Sie nicht 'mit offenen (...)' obwohl). Auf der anderen Seite sollten Sie den Dateiverweis etwas behalten, damit Sie ihn später schließen können. – zvone
Also das einzige Problem damit ist, ist dies eine Web-orientierte Anwendung, so dass dieses Skript Clients behandelt und der Subprozess Aufruf ist im Grunde "Feuer und vergessen." Wenn ich die Variable nicht behalte, kümmert sich das Betriebssystem um die Bereinigung? –