2016-10-04 2 views
0

Ich versuche, die folgenden 2 Befehle in Python nacheinander.Führen Sie Subprozess sequentiell in Python

runmqsc <Queuem manager name> 
Display QL (<queue name>) 

Ich kann den Befehl rumqsc mit Subprozess ausführen.

subprocess.call("runmqsc <queue manager name>", shell= True) 

Jetzt scheint diese Befehle wie die Kontrolle von Python zu nehmen. Wenn ich versuche, den nächsten Befehl mit Subprozess auszuführen, funktioniert es nicht wie erwartet. Ich bin mir nicht einmal sicher, wie ich die zweite ausführen soll (für die ich ein Argument übergeben muss).

Hinzufügen des Code-Schnipsel:

subprocess.call("runmqsc Qmgrname", shell= True) 
subprocess.call("DISPLAY QL(<quename>)",shell=True) 

Nun ist die erste Linie führt in Ordnung und wie durch tdelaney im Kommentar runmqsc wartet auf Eingabe von stdin erwähnt. Und nach dem Ausführen der ersten Zeile hängt das Programm, ohne die zweite Zeile auszuführen.

Jede Hilfe oder Verweise auf eines der verwandten Dokumente würde helfen. Dank

+0

Können Sie dies auf der Kommandozeile tun? – tdelaney

+0

Runmqsc nimmt Befehle von Stdin. Wenn Sie stdin nicht in eine Pipe umleiten oder die Befehle beim Ausführen des Programms nicht manuell eingeben, wird es hängen bleiben und der Aufruf wird nicht zurückkehren. Können Sie ein kleines Skript posten, das zeigt, wie Sie den Befehl ruuieren, damit wir Fixes vorschlagen können? – tdelaney

+0

@tdelaney: Ja, ich kann die Befehle in der Befehlszeile ausführen (ich benutze keinen Subprozess). Ich versuche, die Befehle direkt nacheinander auszuführen.Bitte finden Sie die bearbeitete Frage (haben die Frage mit Code-Ausschnitt aktualisiert). Danke – Phoenix

Antwort

0

Sie don‘ t möchten ausgeführt werden, um Befehle sequentiell zu verarbeiten. Wenn Sie in der Befehlszeile runmqsc ausführen, übernimmt es stdin, führt die Befehle aus, die Sie eingeben, und wird schließlich beendet, wenn Sie es angeben. Von the docs:

:

Durch Eingabe von stdin über die Tastatur können Sie MQSC-Befehle interaktiv eingeben. Durch Umleiten der Eingabe aus einer Datei können Sie eine Folge von häufig in der Datei enthaltenen Befehlen ausführen. Sie können den Ausgabebericht auch in eine Datei umleiten: .

Aber ich denke, es gibt einen dritten Weg. Starten Sie runmqsc, schreiben Sie Ihre Befehle auf stdin und schließen Sie dann stdin. Es sollte die Befehle ausführen und beenden. Es stellt sich heraus, dass Popen.communicate dies für Sie tut. Ich weiß nicht, ob Sie die Ausgabe erfassen wollen, aber in diesem Beispiel lasse ich es auf den Bildschirm gehen.

# start msg queue manager 
mqsc = subprocess.Popen(["runmqsc", "QMAGTRAQ01"], stdin=subprocess.PIPE, 
    stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
# pass command(s) to manager and capture the result 
out, err = mqsc.communicate("DISPLAY QL(BP.10240.012.REQUEST)") 
# wait for command to complete and deal with errors 
retcode = mqsc.wait() 
if retcode != 0: 
    print("-- ERROR --") # fancy error handling here 
print("OUTPUT: ", out) 
print() 
print("ERROR: ", err) 

In python3, out und err sind bytes Objekte, keine Strings. Ähnlich wie beim Verwenden einer Codierung beim Lesen einer Textdatei müssen Sie sie möglicherweise entsprechend der von Ihrem Programm verwendeten Sprache dekodieren. Nehmen wir an, die Datei wäre UTF8, dann würden Sie

out = out.decode('utf-8') 
+0

Vielen Dank. Das funktioniert perfekt. Können Sie mir bitte helfen, wie ich die Ausgabe von mqsc.communicate() abfangen kann. Als zusätzliche Anfrage schlagen Sie bitte einige Links vor, in denen ich über den Subprozess im Detail gehen kann. – Phoenix

+0

Zusätzlicher Code zum Erfassen/Err. Der Link "Popen.communicate" in der Antwort verweist auf die Python-Subprozessdokumente für weitere Details. – tdelaney

+0

Danke für Ihre Hilfe. – Phoenix

0

Auf Unix, Linux oder Windows, können Sie einfach tun:

runmqsc QMgrName <some_mq_cmds.mqsc> some_mq_cmds.out 

In der 'some_mq_cmds.mqsc' Datei, setzen Sie Ihre MQSC-Befehle wie:

DISPLAY QL("TEST.Q1")