2009-06-07 17 views
3

Ich möchte (Pakt?) Mehrere Python-Skripte aus meinem Programm spawnen (auch in Python geschrieben).Wie erstellt man mehrere Python-Skripte aus einem Python-Programm?

Mein Problem ist, dass ich jedem Skript ein Terminal widmen möchte, weil ich ihre Ausgabe mit pexpect sammeln werde.

Ich habe versucht mit pexpect, os.execlp und os.forkpty aber keiner von ihnen tut, was ich erwarte.

Ich möchte die Child-Prozesse spawnen und sie vergessen (sie werden einige Daten verarbeiten, schreiben Sie die Ausgabe an das Terminal, die ich mit pexpect lesen und dann beenden konnte).

Gibt es eine Bibliothek/Best Practice/etc. um diesen Job zu erfüllen?

p.s. Bevor Sie fragen, warum ich in STDOUT schreiben und daraus lesen würde, würde ich sagen, dass ich nicht in STDOUT schreibe, ich lese die Ausgabe von tshark.

Antwort

5

Siehe subprocess module

Der Subprozess-Modul ermöglicht es Ihnen, neue Prozesse zu erzeugen, verbinden ihre Rückgabecodes auf ihre Eingabe/Ausgabe/Fehler Rohre und zu erhalten. Dieses Modul soll mehrere andere, ältere Module und Funktionen, wie zum Beispiel ersetzen:

os.system

os.spawn *

os.popen *

popen2 *

. Befehle. *

0

Ich verstehe nicht, warum Sie dies erwarten müssen. tshark sollte seine Ausgabe an stdout senden, und nur aus irgendeinem seltsamen Grund würde es an stderr senden.

Deshalb, was Sie wollen sein sollte:

import subprocess 

fp= subprocess.Popen(("/usr/bin/tshark", "option1", "option2"), stdout=subprocess.PIPE).stdout 
# now, whenever you are ready, read stuff from fp 
0

Sie wollen ein Terminal oder ein Python-Shell widmen?

Sie haben bereits einige nützliche Antworten für Popen und Subprozess, Sie könnten auch pexpect verwenden, wenn Sie es sowieso schon verwenden möchten.

#for multiple python shells 
import pexpect 

#make your commands however you want them, this is just one method 
mycommand1 = "print 'hello first python shell'" 
mycommand2 = "print 'this is my second shell'" 

#add a "for" statement if you want 
child1 = pexpect.spawn('python') 
child1.sendline(mycommand1) 

child2 = pexpect.spawn('python') 
child2.sendline(mycommand2) 

Machen Sie so viele Kinder/shells, wie Sie wollen und dann die child.before() oder child.after() Ihre Antworten zu erhalten.

Natürlich möchten Sie anstelle von "mycommand1" Definitionen oder zu sendende Klassen hinzufügen, aber dies ist nur ein einfaches Beispiel.

Wenn Sie eine Reihe von Terminals in Linux machen wollten, man muss nur den ‚Python‘ in der pextpext.spawn Linie

ersetzen Anmerkung: Ich habe den obigen Code nicht getestet. Ich antworte nur von früheren Erfahrungen mit Pexpect.