Python Script exécute des commandes dans le terminal

109

J'ai lu cela quelque part il y a quelque temps, mais je n'arrive pas à le trouver. J'essaie de trouver une commande qui exécutera des commandes dans le terminal et produira ensuite le résultat.

Par exemple: le script sera:

command 'ls -l'

Il sortira le résultat de l'exécution de cette commande dans le terminal

Ali
la source

Réponses:

198

Il y a plusieurs moyens de le faire:

Un moyen simple consiste à utiliser le module os:

import os
os.system("ls -l")

Des choses plus complexes peuvent être réalisées avec le module de sous-processus: par exemple:

import subprocess
test = subprocess.Popen(["ping","-W","2","-c", "1", "192.168.1.70"], stdout=subprocess.PIPE)
output = test.communicate()[0]
Uku Loskit
la source
43
Je ne veux pas vous rejeter mais. Vous devez utiliser un sous-processus pour tout. C'est beaucoup plus sûr. subprocess.call () vous fournira une interface sympa pour remplacer le simple formulaire d'appel.
Jorge Vargas
Merci pour cette réponse, mon pote. J'utiliserai python pour ma première application sur le bureau Ubuntu, cela m'aidera vraiment.
LinuxBill
1
Comment puis-je obtenir la réponse complète d'une commande, os.system("nslookup gmail.com")ne renvoie que la dernière ligne 0, mais je veux obtenir la réponse complète.
Parthapratim Neog
3
@JorgeVargas Pouvez-vous m'aider à comprendre pourquoi le sous-processus devrait être utilisé pour tout? Pourquoi est-ce plus sûr?
Soutzikevich
38

Je préfère l'utilisation du module de sous-processus:

from subprocess import call
call(["ls", "-l"])

La raison est que si vous voulez passer une variable dans le script, cela donne un moyen très simple, par exemple, prenez la partie suivante du code

abc = a.c
call(["vim", abc])
Kevin Pandya
la source
A bien fonctionné pour moi en ouvrant une image avec des paramètres supplémentairescall(["eog", "1breeproposal.png", "-f"])
Josh
4

Vous devriez également regarder dans commands.getstatusoutput

Cela renvoie un tuple de longueur 2 .. Le premier est l'entier de retour (0 - lorsque les commandes sont réussies), le second est la sortie entière comme cela sera montré dans le terminal.

Pour ls

    import commands
    s=commands.getstatusoutput('ls')
    print s
    >> (0, 'file_1\nfile_2\nfile_3')
    s[1].split("\n")
    >> ['file_1', 'file_2', 'file_3']
minocha
la source
2
import os
os.system("echo 'hello world'")

Cela devrait fonctionner. Je ne sais pas comment imprimer la sortie dans le shell python.

Mr_pzling_Pie
la source
1

Le os.popen () est assez simple à utiliser, mais il a été dépréciée depuis Python 2.6. Vous devez utiliser le module de sous - processus à la place.

Lire ici: lire un os.popen (commande) dans une chaîne

Paolo Rovelli
la source
1

Jupyter

Dans un notebook Jupyter, vous pouvez utiliser la fonction magique !

!echo "execute a command"
files = !ls -a /data/dir/ #get the output into a variable

ipython

Pour l'exécuter en tant que .pyscript, vous devez utiliseripython

files = get_ipython().getoutput('ls -a /data/dir/')

exécuter le script

$ ipython my_script.py
Zephro
la source
0

Vous pouvez importer le module 'os' et l'utiliser comme ceci:

import os
os.system('#DesiredAction')
Kobe Keirouz
la source
0

pour python3, utilisez le sous-processus

import subprocess
s = subprocess.getstatusoutput(f'ps -ef | grep python3')
print(s)
Avi Avidan
la source