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

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]

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])

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']

2
import os
os.system("echo 'hello world'")

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



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

0

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

import os
os.system('#DesiredAction')

0

pour python3, utilisez le sous-processus

import subprocess
s = subprocess.getstatusoutput(f'ps -ef | grep python3')
print(s)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.