6121 Stimmen

Wie kann ich ein Programm ausführen oder einen Systembefehl aufrufen?

Wie rufe ich einen externen Befehl in Python auf, als hätte ich ihn in einer Shell oder Eingabeaufforderung eingegeben?

0 Stimmen

Ich verstehe das nicht, was ist falsch an import os; os.system('pip list | grep anatome') ? Zumindest kann man damit Piping machen, wie mein Beispiel zeigt. Es ist nicht klar, wie man das mit import subprocess; subprocess.run(["ls", "-l"]) .

177voto

sirwart Punkte 2364

Ich würde empfehlen, die Unterprozess Modul anstelle von os.system, weil es das Shell-Escaping für Sie übernimmt und daher viel sicherer ist.

subprocess.call(['ping', 'localhost'])

0 Stimmen

Wenn Sie möchten, dass eine Liste aus einem Befehl mit Parametern erstellen , eine Liste, die mit subprocess wenn shell=False verwenden, dann shlex.split für eine einfache Möglichkeit, dies zu tun docs.python.org/2/Bibliothek/shlex.html#shlex.split (laut der Dokumentation ist dies die empfohlene Methode. docs.python.org/2/library/subprocess.html#popen-constructor )

14 Stimmen

Dies ist falsch: " es übernimmt die Muschelentfernung für Sie und ist daher viel sicherer ". subprocess führt kein Shell-Escaping durch, subprocess leitet Ihren Befehl nicht durch die Shell, daher ist kein Shell-Escaping erforderlich.

172voto

Alexandra Franks Punkte 2894
import os
cmd = 'ls -al'
os.system(cmd)

Wenn Sie die Ergebnisse des Befehls zurückgeben möchten, können Sie os.popen . Dies ist jedoch seit Version 2.6 veraltet zugunsten der Unterprozessmodul die in anderen Antworten gut behandelt wurden.

16 Stimmen

Popen ist veraltet zugunsten von Unterprozess .

0 Stimmen

Sie können Ihr Ergebnis auch mit dem os.system-Aufruf speichern, da dieser wie die UNIX-Shell selbst funktioniert, wie zum Beispiel os.system('ls -l > test2.txt')

136voto

Tom Fuller Punkte 4941

Es gibt viele verschiedene Bibliotheken, die es ermöglichen, externe Befehle mit Python aufzurufen. Für jede Bibliothek habe ich eine Beschreibung gegeben und ein Beispiel für den Aufruf eines externen Befehls gezeigt. Der Befehl, den ich als Beispiel verwendet habe, lautet ls -l (alle Dateien auflisten). Wenn Sie mehr über eine der Bibliotheken erfahren möchten, habe ich die Dokumentation für jede von ihnen aufgelistet und verlinkt.

Quellen

Dies sind alle Bibliotheken

Ich hoffe, dies hilft Ihnen bei der Entscheidung, welche Bibliothek Sie verwenden sollten :)

Unterprozess

Mit Subprocess können Sie externe Befehle aufrufen und sie mit ihren Eingabe-/Ausgabe-/Fehlerleitungen (stdin, stdout und stderr) verbinden. Subprocess ist die Standardwahl für die Ausführung von Befehlen, aber manchmal sind andere Module besser.

subprocess.run(["ls", "-l"]) # Run command
subprocess.run(["ls", "-l"], stdout=subprocess.PIPE) # This will run the command and return any output
subprocess.run(shlex.split("ls -l")) # You can also use the shlex library to split the command

os

os wird für "betriebssystemabhängige Funktionen" verwendet. Es kann auch verwendet werden, um externe Befehle aufzurufen mit os.system y os.popen (Hinweis: Es gibt auch einen subprocess.popen). os führt immer die Shell aus und ist eine einfache Alternative für Leute, die keine Notwendigkeit haben oder nicht wissen, wie man subprocess.run .

os.system("ls -l") # Run command
os.popen("ls -l").read() # This will run the command and return any output

sh

sh ist eine Subprozess-Schnittstelle, mit der Sie Programme so aufrufen können, als wären es Funktionen. Dies ist nützlich, wenn Sie einen Befehl mehrmals ausführen möchten.

sh.ls("-l") # Run command normally
ls_cmd = sh.Command("ls") # Save command as a variable
ls_cmd() # Run command as if it were a function

Plumbum

plumbum ist eine Bibliothek für "skriptähnliche" Python-Programme. Sie können Programme wie Funktionen aufrufen wie in sh . Plumbum ist nützlich, wenn Sie eine Pipeline ohne die Shell betreiben wollen.

ls_cmd = plumbum.local("ls -l") # Get command
ls_cmd() # Run command

erwarten

pexpect ermöglicht es Ihnen, untergeordnete Anwendungen zu starten, sie zu kontrollieren und Muster in ihren Ausgaben zu finden. Dies ist eine bessere Alternative zu subprocess für Befehle, die unter Unix ein tty erwarten.

pexpect.run("ls -l") # Run command as normal
child = pexpect.spawn('scp foo user@example.com:.') # Spawns child application
child.expect('Password:') # When this is the output
child.sendline('mypassword')

Stoff

fabric ist eine Bibliothek für Python 2.5 und 2.7. Sie ermöglicht die Ausführung von lokalen und entfernten Shell-Befehlen. Fabric ist eine einfache Alternative für die Ausführung von Befehlen in einer sicheren Shell (SSH)

fabric.operations.local('ls -l') # Run command as normal
fabric.operations.local('ls -l', capture = True) # Run command and receive output

Abgesandter

envoy ist als "Unterprozess für Menschen" bekannt. Er wird als bequeme Umhüllung des subprocess Modul.

r = envoy.run("ls -l") # Run command
r.std_out # Get output

Befehle

commands enthält Wrapper-Funktionen für os.popen aber es wurde aus Python 3 entfernt, da subprocess ist eine bessere Alternative.

88voto

Honza Javorek Punkte 7851

Mit der Standardbibliothek

Verwenden Sie die Unterprozessmodul (Python 3):

import subprocess
subprocess.run(['ls', '-l'])

Dies ist die empfohlene Standardmethode. Kompliziertere Aufgaben (Pipes, Output, Input, etc.) können jedoch mühsam zu konstruieren und zu schreiben sein.

Hinweis zur Python-Version: Wenn Sie noch Python 2 verwenden, subprocess.call funktioniert auf ähnliche Weise.

ProTipp: shlex.split kann Ihnen helfen, den Befehl für run , call und andere subprocess Funktionen, falls Sie diese nicht in Form von Listen bereitstellen wollen (oder können!):

import shlex
import subprocess
subprocess.run(shlex.split('ls -l'))

Mit externen Abhängigkeiten

Wenn Sie sich nicht an externen Abhängigkeiten stören, verwenden Sie Plumbum :

from plumbum.cmd import ifconfig
print(ifconfig['wlan0']())

Es ist die beste subprocess Wrapper. Es ist plattformübergreifend, d.h. es funktioniert sowohl unter Windows als auch unter Unix-ähnlichen Systemen. Installieren durch pip install plumbum .

Eine weitere beliebte Bibliothek ist sh :

from sh import ifconfig
print(ifconfig('wlan0'))

Allerdings, sh hat die Windows-Unterstützung eingestellt, so dass es nicht mehr so toll ist wie früher. Installieren durch pip install sh .

86voto

Jorge E. Cardona Punkte 87475

Ich benutze immer fabric für diese Dinge wie:

from fabric.operations import local
result = local('ls', capture=True)
print "Content:/n%s" % (result, )

Aber das scheint ein gutes Werkzeug zu sein: sh (Python-Unterprozess-Schnittstelle) .

Sehen Sie sich ein Beispiel an:

from sh import vgdisplay
print vgdisplay()
print vgdisplay('-v')
print vgdisplay(v=True)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X