2012-04-30 6 views
1

Je suis en train d'essayer d'écrire un programme qui exécute certaines commandes shell avec des données utilisateur émulées.Pexpect Python ne fonctionne pas comme prévu

Le problème est que la commande shell ne fonctionne pas correctement sans cette ligne à la fin du code:

raw_input('press <enter> to exit') 

Comment puis-je me débarrasser de cette ligne?

child = pexpect.spawn('grunt init:gruntfile') 
child.logfile_read = sys.stdout 

child.expect ('Is the DOM involved in ANY way?') 
child.sendline ('y') 
child.logfile_read = sys.stdout 

child.expect ('Will files be concatenated or minified?') 
child.sendline ('y') 
child.logfile_read = sys.stdout 

child.expect ('Will you have a package.json file?') 
child.sendline ('y') 
child.logfile_read = sys.stdout 

child.expect ('Do you need to make any changes to the above before continuing?') 
child.sendline ('n') 
child.logfile_read = sys.stdout 

raw_input('press <enter> to exit') 
+0

Est-ce que ce titre est censé être une blague ;-) – puk

Répondre

6

Le problème semble être que sans raw_input pour ralentir le programme, votre script python est sortie avant que le processus de l'enfant est terminé (et tuer le processus de l'enfant dans le processus).

Je pense que pexpect.wait() est censé gérer cette situation, mais il semble de the documentation comme wait() va se bloquer s'il y a sortie non lue après la sortie du processus enfant, et sans connaître les détails de votre processus enfant je ne peux pas dire si oui ou non il y a un risque qui va arriver. Une combinaison de read() et wait() peut fonctionner, ou si c'est trop de mal à comprendre cela, vous pouvez juste time.sleep() un certain nombre de secondes.

+0

Le wait() l'a fait. Merci beaucoup! – Theadamlt

+0

De la documentation, il semble que 'read()' devrait être utilisé. Sans arguments, il sera lu jusqu'à ce qu'il obtienne un EOF. Contrairement à 'read_nonblocking()', il devrait bloquer, et donc attendre que le processus se termine. – geon

Questions connexes