Python Script führt Befehle im Terminal aus

109

Ich habe das vor einiger Zeit irgendwo gelesen, kann es aber nicht finden. Ich versuche, einen Befehl zu finden, der Befehle im Terminal ausführt und dann das Ergebnis ausgibt.

Zum Beispiel: Das Skript lautet:

command 'ls -l'

Das Ergebnis der Ausführung dieses Befehls im Terminal wird ausgegeben

Ali
quelle

Antworten:

197

Es gibt verschiedene Möglichkeiten, dies zu tun:

Ein einfacher Weg ist die Verwendung des OS-Moduls:

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

Mit dem Unterprozessmodul können komplexere Dinge erreicht werden: zum Beispiel:

import subprocess
test = subprocess.Popen(["ping","-W","2","-c", "1", "192.168.1.70"], stdout=subprocess.PIPE)
output = test.communicate()[0]
Uku Loskit
quelle
43
Ich will dich aber nicht ablehnen. Sie sollten für alles einen Unterprozess verwenden. Es ist viel sicherer. Mit subprocess.call () erhalten Sie eine schöne Oberfläche, um das einfache Aufrufformular zu ersetzen.
Jorge Vargas
Danke für diese Antwort Kumpel. Ich werde Python für meine erste Anwendung auf dem Ubuntu-Desktop verwenden, das wird mir wirklich helfen.
LinuxBill
1
Wie kann ich die vollständige Antwort eines Befehls erhalten, gibt os.system("nslookup gmail.com")nur die letzte Zeile zurück 0, aber ich möchte die vollständige Antwort erhalten.
Parthapratim Neog
3
@JorgeVargas Kannst du mir helfen zu verstehen, warum der Unterprozess für alles verwendet werden sollte? Warum ist es sicherer?
Soutzikevich
38

Ich bevorzuge die Verwendung eines Unterprozessmoduls:

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

Der Grund dafür ist, dass Sie, wenn Sie eine Variable im Skript übergeben möchten, auf sehr einfache Weise beispielsweise den folgenden Teil des Codes übernehmen können

abc = a.c
call(["vim", abc])
Kevin Pandya
quelle
Hat gut funktioniert, als ich ein Bild mit zusätzlichen Parametern geöffnet habecall(["eog", "1breeproposal.png", "-f"])
Josh
4

Sie sollten auch in command.getstatusoutput nachsehen

Dies gibt ein Tupel der Länge 2 zurück. Das erste ist die Rückgabe-Ganzzahl (0 - wenn die Befehle erfolgreich sind). Das zweite ist die gesamte Ausgabe, wie im Terminal angezeigt wird.

Für 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
quelle
2
import os
os.system("echo 'hello world'")

Das sollte funktionieren. Ich weiß nicht, wie ich die Ausgabe in die Python-Shell drucken soll.

Mr_pzling_Pie
quelle
1

Das os.popen () ist ziemlich einfach zu bedienen, aber seit Python 2.6 veraltet. Sie sollten stattdessen das Unterprozessmodul verwenden.

Lesen Sie hier: Lesen eines os.popen (Befehls) in einen String

Paolo Rovelli
quelle
1

Jupyter

In einem Jupyter-Notizbuch können Sie die magische Funktion verwenden !

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

Ipython

Um dies als .pySkript auszuführen , müssten Sie verwendenipython

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

Skript ausführen

$ ipython my_script.py
Zephro
quelle
0

Sie können das 'os'-Modul importieren und wie folgt verwenden:

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

Verwenden Sie für Python3 den Unterprozess

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