J'ai besoin de stocker le résultat d'une commande Shell que j'ai exécutée dans une variable, mais je n'ai pas pu le faire fonctionner. J'ai essayé comme:
import os
call = os.system("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'")
print call
Mais il imprime le résultat dans le terminal et imprime la valeur de l'appel à zéro, indiquant éventuellement le succès. Comment obtenir le résultat stocké dans une variable?
Utilisez plutôt le module subprocess
:
import subprocess
output = subprocess.check_output("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'", Shell=True)
Edit: c'est nouveau dans Python 2.7. Dans les versions précédentes, cela devrait fonctionner (avec la commande réécrite comme indiqué ci-dessous):
import subprocess
output = subprocess.Popen(['awk', '/f89e7000/ {print $2}', 'syscall_list.txt'], stdout=subprocess.PIPE).communicate()[0]
En remarque, vous pouvez réécrire
cat syscall_list.txt | grep f89e7000
À
grep f89e7000 syscall_list.txt
Et vous pouvez même remplacer l'intégralité de l'instruction par un seul script awk
:
awk '/f89e7000/ {print $2}' syscall_list.txt
Menant à:
import subprocess
output = subprocess.check_output(['awk', '/f89e7000/ {print $2}', 'syscall_list.txt'])
commands.getstatusoutput fonctionnerait bien pour cette situation. (Obsolète depuis Python 2.6)
import commands
print(commands.getstatusoutput("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'"))
os.popen fonctionne pour cela. popen - ouvre un canal vers ou depuis la commande. La valeur de retour est un objet fichier ouvert connecté au tuyau, qui peut être lu. split ('\ n') convertit la sortie en liste
import os
list_of_ls = os.popen("ls").read().split('\n')
print list_of_ls
import os
list_of_call = os.popen("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'").read().split('\n')
print list_of_call
Dans python 3 vous pouvez utiliser
import subprocess as sp
output = sp.getoutput('whoami --version')
print (output)
``