2009-06-07 8 views
3

Je veux générer (fork?) Plusieurs scripts Python à partir de mon programme (écrit aussi en Python).Comment générer plusieurs scripts python à partir d'un programme python?

Mon problème est que je veux dédier un terminal à chaque script, parce que je vais rassembler leur sortie en utilisant pexpect.

J'ai essayé d'utiliser pexpect, os.execlp et os.forkpty mais aucun d'entre eux ne fait comme je l'espère.

Je veux générer les processus enfants et les oublier (ils vont traiter certaines données, écrire la sortie sur le terminal que je pourrais lire avec pexpect puis quitter).

Y at-il une bibliothèque/meilleure pratique/etc. pour accomplir ce travail?

p.s. Avant de vous demander pourquoi j'écrirais à STDOUT et en lirais, je dirai que je n'écris pas sur STDOUT, j'ai lu la sortie de tshark.

Répondre

5

Voir la subprocess module

Le module subprocess vous permet de frayer de nouveaux processus, se connecter à leurs entrées/sorties/tuyaux d'erreur, et d'obtenir leurs codes de retour. Ce module a l'intention de remplacer plusieurs autres, des modules et des fonctions plus anciennes, telles que:

os.system

os.spawn *

os.popen *

popen2 *

. commandes. *

0

Je ne comprends pas pourquoi vous devez vous attendre à cela. tshark devrait envoyer sa sortie à stdout, et seulement pour une raison étrange serait-il l'envoyer à stderr.

Par conséquent, ce que vous voulez doit être:

import subprocess 

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

Vous voulez dédier un terminal ou un shell python?

Vous avez déjà quelques réponses utiles pour Popen et sous-processus, vous pouvez également utiliser pexpect si vous prévoyez déjà de l'utiliser de toute façon.

#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) 

Faire plus d'enfants/shells que vous voulez, puis utilisez le child.before() ou child.after() pour obtenir vos réponses.

Bien sûr, vous voudrez ajouter des définitions ou des classes à envoyer à la place de "mycommand1", mais ce n'est qu'un exemple simple.

Si vous voulez faire un tas de terminaux sous Linux, il vous suffit de remplacer la dans la ligne de pextpext.spawn « python »

Note: Je ne l'ai pas testé le code ci-dessus. Je ne fais que répondre à l'expérience passée avec pexpect.

Questions connexes