2011-06-07 4 views
3

Je veux faire:Comment exécuter la séquence de bash longue avec Python subprocess

Code Bash:

grub --batch << EOF 
root (hd0,1) 
find /boot/grub/menu.lst 
setup (hd0) 
quit 
EOF 

code Python:

subprocess.call('grub --batch << EOF', shell=True) 
subprocess.call('root (hd0,1)', shell=True) 
subprocess.call('find /boot/grub/menu.lst', shell=True) 
subprocess.call('setup (hd0)', shell=True) 
subprocess.call('quit', shell=True) 
subprocess.call('EOF', shell=True) 

Mais cela ne fonctionne pas .. Quelqu'un maintenant la façon alternative de résoudre ce problème?

Merci beaucoup!

+0

Effectuez simplement un appel à 'subprocess.call' avec la commande entière avec des retours à la ligne. –

+0

Oui, je pensais aussi cela. Mais n'a pas fonctionné! – JonatasTeixeira

Répondre

1

Vous pourriez faire quelque chose d'horrible comme:

subprocess.call('echo -e "root (hd0,1)\nfind /boot/grub/menu.lst\nsetup (hd0)\nquit" | grub --batch', shell=True)

Je suis sûr qu'il ya une meilleure façon de le faire bien.

+0

Parfait .. Merci .. Je vais essayer de mettre ce code dans le projet ici. Mais je pense que ça va marcher. Merci pour votre patience! – JonatasTeixeira

5

La solution est d'envoyer le script comme une chaîne:

script = ''' 
root (hd0,1) 
find /boot/grub/menu.lst 
setup (hd0) 
quit 
''' 
print subprocess.Popen('grub', stderr=subprocess.STDOUT).communicate(script)[0] 

shell=True ne devrait pas être nécessaire.

+1

+1: L'intégration de shell en Python (ou dans tout autre langage) est un bon moyen d'introduire des problèmes de maintenance. Vous êtes contraint d'avoir besoin de grub pour faire le gros du travail, mais utilisez les installations Python intrinsèques autant que possible comme Aaron l'a fait. – msw

Questions connexes