2016-08-26 1 views
0

Also, was ich versuche, ist ein Programm aus einem Python-Skript ausführen, die ich in der Shell ausführen. Ich habe andere Fragen lesen, damit ich es mit tun können:Wie kann ich eine bash ausführbare Datei von einem Python-Skript mit dem gleichen I/O ausführen?

def bash(cmd): 
    subprocess.Popen(cmd, shell=True, executable='/bin/bash') 
bash('./my/file') 

Und das erste Problem dabei ist, möchte ich oft das Programm von Shell beenden. Normalerweise, wenn ich "./my/file" vom Terminal habe, könnte ich es mit ctrl + c stoppen. Aber mit subprocess läuft es im Hintergrund irgendwie und ich kann es nur durch den Befehl "top" töten und es durch pid in bash töten. Aber das Programm bringt eine große Anzahl von Prozessen so schnell hervor, dass ich es auf eine vernünftige Weise buchstäblich nicht töten kann.

Auch die zweite Sache, die ich tun möchte, ist zu warten, bis das Programm fertig ist, bevor ich mehr von meinem Python-Skript ausführe. Ich habe versucht, Einstellung ...

Aber das stoppt eigentlich das Programm fast sofort nach dem Start.

Ich konnte die Skripte einfach separat ausführen, aber ich sehe keine Möglichkeit, die Ergebnisse aus dem Programm zu verwenden, ohne ein drittes Skript zu erstellen, das ich nach dem ursprünglichen Python-Skript ausführen muss. Irgendwelche Vorschläge?

Antwort

0

Für Sie erste Frage, versuchen preexec_fn Argument:

import signal 
import ctypes 
libc = ctypes.CDLL("libc.so.6") 
def set_pdeathsig(sig = signal.SIGTERM): 
    def callable(): 
     return libc.prctl(1, sig) 
    return callable 
p = subprocess.Popen(args, preexec_fn = set_pdeathsig(signal.SIGTERM)) 

Dadurch wird sichergestellt, die alle Kinder von subprocess.Popen gelaicht Prozesse werden direkt nach dem Mutter Prozess beendet automatisch verlassen. Alles, was Sie töten müssen, ist nur der Python-Prozess.

Für Sie zweite Frage, versuchen communicate Methode:

process=subprocess.Popen(cmd, shell=True, executable='/bin/bash', stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
out, err = process.communicate() 

Es wird ein Rohr zwischen Ihrem Python-Prozess und seine untergeordneten Prozess, durch den die Dateneingabe bauen, um das Kind Prozess übergeben werden und das Ergebnis zurückgeführt werden kann zurück. Wenn Sie die Methode communicate nicht aufrufen, wird der Prozess im Allgemeinen im Hintergrund ausgeführt und das Ergebnis, falls vorhanden, wird verworfen.

Durch Aufruf der Methode communicate wird der übergeordnete Prozess hier blockiert und wartet darauf, dass der untergeordnete Prozess beendet wird. out und err stellen die normale Ausgabe und die Fehlerausgabe des untergeordneten Prozesses dar. Sie können es verwenden, um die Ausgabe des Bash-Skripts zu erhalten.

+0

Danke für die Antwort, ich bin ein wenig beschäftigt, so habe ich nur die zweite überprüft und es funktioniert etwas, da es eine Ausgabe aus dem Programm korrekt, aber manchmal verhindert, dass das Programm ausgeführt wird. –

Verwandte Themen