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.