2012-06-22 8 views
1

J'ai un script Python qui a besoin d'émettre un certain nombre de commandes shell. Je pensais pouvoir créer un objet de sous-processus et le réutiliser chaque fois que j'avais une commande à exécuter.Réutiliser objet subprocess

Voilà comment j'ai mon code mis en place:

def setupPipeline(self): 
    setupShell = subprocess.Popen([''], stdout=subprocess.PIPE, shell=True, stderr=subprocess.PIPE, stdin=subprocess.PIPE) 

    # Stop running pipeline 
    setupShell.stdin.write('stop ' + self.Name) 
    output = setupShell.stdout.read() 
    print output 

    # Cancel any running jobs and cleanup variables 
    setupShell.stdin.write('sudo -u pr cancel ALL') 
    output = setupShell.stdout.read() 
    print output 

    setupShell.stdin.write('sudo -u pr clean ALL') 
    output = setupShell.stdout.read() 
    print output 

(sauter beaucoup d'autres code ici)

if __name__ == '__main__': 
#self-test code 
pipelineObj = Pipeline(sys.argv) 
pipelineObj.setupPipeline() 

Cependant, lorsque le code arrive à la deuxième commande je reçois un Comment puis-je procéder à la réutilisation d'un objet de sous-processus pour émettre des commandes qui doivent toutes s'exécuter dans le même interpréteur? Ces commandes ne peuvent pas être simplement chaînées car il y a un traitement entre chaque appel.

+0

(a) pourquoi vous devez réutiliser la même coquille à plusieurs reprises? (b) Pourquoi devez-vous utiliser une coquille? Vous pouvez simplement [exécuter ces commandes directement en utilisant un tableau pour fendit commande de l'argument] (http://docs.python.org/library/subprocess.html#subprocess.Popen) - et être sûr que le 'path' ni Les variables d'environnement 'IFS' influenceront l'exécution de votre programme. – sarnold

+0

Parce que les résultats de chaque commande doivent affecter l'environnement shell des commandes suivantes. –

Répondre

3

Créer un sous-processus qui exécute un shell, et envoyer des commandes à cela. Vous exécutez une commande vide dans la coquille, ce qui entraîne à exécuter cette commande vide puis sortie.

shell = subprocess.Popen("/bin/bash -i".split(), stdin=subprocess.PIPE, 
         stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

Vous pourriez plutôt envisager d'utiliser pexpect comme il semble que vous êtes bien sur votre chemin pour réinventant ..

+0

Je pensais que je faisais cela avec la ligne « setupShell = ». Je pensais que si je n'émettais pas une commande initiale, je créerais simplement un processus shell sans quitter. –

+0

Non, regardez ce que la commande que vous exécutez dans cette ligne: ' « »'. 'shell = True' signifie que la commande vide sera exécutée dans le shell, mais qu'est-ce qui continuera à faire fonctionner le shell après l'exécution de la commande vide? Rien, c'est quoi. – kindall

+0

Merci pour les commentaires et le lien. –