Wie ruft man einen externen Befehl (als hätte ich ihn an der Unix-Shell oder an der Windows-Eingabeaufforderung eingegeben) in einem Python-Skript auf?
Schauen Sie sich das Unterprozessmodul in der Standardbibliothek an:
import subprocess
subprocess.run(["ls", "-l"])
Der Vorteil subprocess
gegenüber system
ist , dass es flexibler ist (Sie das bekommen kann stdout
, stderr
die „echten“ Statuscode, eine bessere Fehlerbehandlung, etc ...).
In der offiziellen Dokumentation wird das subprocess
Modul gegenüber der Alternative empfohlen os.system()
:
Das
subprocess
Modul bietet leistungsfähigere Funktionen zum Laichen neuer Prozesse und zum Abrufen ihrer Ergebnisse. Die Verwendung dieses Moduls ist der Verwendung dieser Funktion vorzuziehen [os.system()
].
Der Abschnitt Ersetzen älterer Funktionen durch das Unterprozessmodul in der subprocess
Dokumentation enthält möglicherweise einige hilfreiche Rezepte.
Verwenden Sie für Versionen von Python vor 3.5 call
:
import subprocess
subprocess.call(["ls", "-l"])
echo $PATH
indem ich verwendet habecall(["echo", "$PATH"])
, aber es hat nur die Literalzeichenfolge wiedergegeben,$PATH
anstatt eine Ersetzung vorzunehmen. Ich weiß, dass ich die Umgebungsvariable PATH erhalten könnte, aber ich frage mich, ob es eine einfache Möglichkeit gibt, den Befehl genau so zu verhalten, als hätte ich ihn in bash ausgeführt.shell=True
.shell=True
, für diesen Zweck wird Python mit os.path.expandvars geliefert . In Ihrem Fall können Sie schreiben :os.path.expandvars("$PATH")
. @ SethMMorton bitte überdenken Sie Ihren Kommentar -> Warum nicht Shell = True verwendenfor
Schleife ausführen möchte, wie mache ich das, ohne dass mein Python-Skript blockiert wird? Die Ausgabe des Befehls ist mir egal, ich möchte nur viele davon ausführen.subprocess
wennshell=False
, dann verwenden Sieshlex.split
für eine einfache Möglichkeit , dies zu tun docs.python.org/2/library/shlex.html#shlex.splitHier ist eine Zusammenfassung der Möglichkeiten, externe Programme aufzurufen, sowie der Vor- und Nachteile der einzelnen Programme:
os.system("some_command with args")
Übergibt den Befehl und die Argumente an die Shell Ihres Systems. Dies ist hilfreich, da Sie auf diese Weise tatsächlich mehrere Befehle gleichzeitig ausführen und Pipes sowie eine Eingabe- / Ausgabeleitung einrichten können. Zum Beispiel:Dies ist zwar praktisch, Sie müssen jedoch das Escapezeichen von Shell-Zeichen wie Leerzeichen usw. manuell behandeln. Auf diese Weise können Sie jedoch auch Befehle ausführen, bei denen es sich lediglich um Shell-Befehle und nicht um externe Programme handelt. Siehe die Dokumentation .
stream = os.popen("some_command with args")
wird das Gleiche tun,os.system
außer dass es Ihnen ein dateiähnliches Objekt gibt, mit dem Sie auf die Standardeingabe / -ausgabe für diesen Prozess zugreifen können. Es gibt 3 andere Varianten von Popen, die alle die E / A etwas anders handhaben. Wenn Sie alles als Zeichenfolge übergeben, wird Ihr Befehl an die Shell übergeben. Wenn Sie sie als Liste übergeben, müssen Sie sich keine Sorgen machen, dass Sie irgendetwas entkommen. Siehe die Dokumentation .Die
Popen
Klasse dessubprocess
Moduls. Dies ist als Ersatz für gedachtos.popen
, hat aber den Nachteil, dass es aufgrund seiner Vollständigkeit etwas komplizierter ist. Zum Beispiel würden Sie sagen:anstatt:
Es ist jedoch schön, alle Optionen in einer einheitlichen Klasse anstelle von 4 verschiedenen Popen-Funktionen zu haben. Siehe die Dokumentation .
Die
call
Funktion aus demsubprocess
Modul. Dies ist im Grunde genau wie diePopen
Klasse und akzeptiert alle gleichen Argumente, wartet jedoch einfach, bis der Befehl abgeschlossen ist und Sie den Rückkehrcode erhalten. Zum Beispiel:Siehe die Dokumentation .
Wenn Sie mit Python 3.5 oder höher arbeiten, können Sie die neue
subprocess.run
Funktion verwenden, die der obigen sehr ähnlich ist, aber noch flexibler ist und einCompletedProcess
Objekt zurückgibt, wenn der Befehl die Ausführung beendet hat.Das OS-Modul verfügt auch über alle Fork / Exec / Spawn-Funktionen, die Sie in einem C-Programm haben würden, aber ich empfehle nicht, sie direkt zu verwenden.
Das
subprocess
Modul sollte wahrscheinlich das sein, was Sie verwenden.Beachten Sie schließlich, dass für alle Methoden, bei denen Sie den endgültigen Befehl übergeben, der von der Shell als Zeichenfolge ausgeführt werden soll, Sie dafür verantwortlich sind, ihn zu maskieren. Es gibt schwerwiegende Auswirkungen auf die Sicherheit, wenn einem Teil der übergebenen Zeichenfolge nicht vollständig vertraut werden kann. Zum Beispiel, wenn ein Benutzer einen Teil der Zeichenfolge eingibt. Wenn Sie sich nicht sicher sind, verwenden Sie diese Methoden nur mit Konstanten. Um Ihnen einen Hinweis auf die Auswirkungen zu geben, betrachten Sie diesen Code:
und stellen Sie sich vor, dass der Benutzer etwas eingibt, "meine Mutter hat mich nicht geliebt && rm -rf /", das das gesamte Dateisystem löschen könnte.
quelle
open
.subprocess.run()
. docs.python.org/3.5/library/subprocess.html#subprocess.runsubprocess.run(..)
Was genau bedeutet mit den derzeit empfohlenen Methoden ? "Dies erfasst standardmäßig nicht stdout oder stderr." implizieren? Was ist mitsubprocess.check_output(..)
und STDERR?echo
vor der Zeichenfolge übergeben anPopen
? So wird der volle Befehl seinecho my mama didnt love me && rm -rf /
.subprocess.run()
oder seine älteren Geschwistersubprocess.check_call()
et al. Für Fälle, in denen diese nicht ausreichen, siehesubprocess.Popen()
.os.popen()
sollte vielleicht gar nicht erwähnt werden oder auch nach "hacken Sie Ihren eigenen Fork / Exec / Spawn-Code" kommen.Typische Implementierung:
Sie können mit den
stdout
Daten in der Pipe tun, was Sie wollen . Tatsächlich können Sie diese Parameter (stdout=
undstderr=
) einfach weglassen und es wird sich so verhaltenos.system()
.quelle
.readlines()
liest alle Zeilen auf einmal, dh es blockiert, bis der Unterprozess beendet wird (schließt sein Ende der Pipe). Um in Echtzeit zu lesen (wenn es keine Pufferprobleme gibt), können Sie:for line in iter(p.stdout.readline, ''): print line,
p.stdout.readline()
(Hinweis: Neins
am Ende) keine Daten angezeigt werden, bis das untergeordnete Element seinen Puffer füllt. Wenn das Kind nicht viele Daten produziert, erfolgt die Ausgabe nicht in Echtzeit. Siehe den zweiten Grund in F: Warum nicht einfach eine Pipe (popen ()) verwenden? . Einige Problemumgehungen sind in dieser Antwort angegeben (pexpect, pty, stdbuf)Popen
für einfache Aufgaben empfehlen . Dies spezifiziert auch unnötigshell=True
. Versuchen Sie eine dersubprocess.run()
Antworten.Einige Hinweise zum Trennen des untergeordneten Prozesses vom aufrufenden (Starten des untergeordneten Prozesses im Hintergrund).
Angenommen, Sie möchten eine lange Aufgabe über ein CGI-Skript starten. Das heißt, der untergeordnete Prozess sollte länger dauern als der Ausführungsprozess des CGI-Skripts.
Das klassische Beispiel aus der Dokumentation des Unterprozessmoduls lautet:
Die Idee hier ist, dass Sie nicht in der Zeile 'Unterprozess aufrufen' warten möchten, bis die Datei longtask.py fertig ist. Es ist jedoch nicht klar, was nach der Zeile "hier etwas mehr Code" aus dem Beispiel passiert.
Meine Zielplattform war FreeBSD, aber die Entwicklung war unter Windows, so dass ich zuerst unter Windows mit dem Problem konfrontiert war.
Unter Windows (Windows XP) wird der übergeordnete Prozess erst beendet, wenn die Datei longtask.py ihre Arbeit beendet hat. Es ist nicht das, was Sie in einem CGI-Skript wollen. Das Problem ist nicht spezifisch für Python. In der PHP-Community sind die Probleme dieselben.
Die Lösung besteht darin, DETACHED_PROCESS zu übergeben Prozesserstellungsflag an die zugrunde liegende CreateProcess-Funktion in der Windows-API zu übergeben. Wenn Sie pywin32 installiert haben, können Sie das Flag aus dem win32process-Modul importieren. Andernfalls sollten Sie es selbst definieren:
/ * UPD 2015.10.27 @eryksun in einem Kommentar unten stellt fest, dass das semantisch korrekte Flag CREATE_NEW_CONSOLE (0x00000010) * / ist
Unter FreeBSD haben wir ein weiteres Problem: Wenn der übergeordnete Prozess abgeschlossen ist, werden auch die untergeordneten Prozesse abgeschlossen. Und das ist auch nicht das, was Sie in einem CGI-Skript wollen. Einige Experimente zeigten, dass das Problem darin bestand, sys.stdout zu teilen. Und die funktionierende Lösung war die folgende:
Ich habe den Code auf anderen Plattformen nicht überprüft und kenne die Gründe für das Verhalten unter FreeBSD nicht. Wenn jemand weiß, teilen Sie bitte Ihre Ideen. Das Googeln beim Starten von Hintergrundprozessen in Python bringt noch kein Licht.
quelle
DETACHED_PROCESS
increationflags
vermeidet dies durch das Kind zu verhindern , vererben oder eine Konsole zu schaffen. Wenn Sie stattdessen eine neue Konsole möchten, verwenden SieCREATE_NEW_CONSOLE
(0x00000010).os.devnull
weil einige Konsolenprogramme mit einem anderen Fehler beendet werden, festlegen. Erstellen Sie eine neue Konsole, wenn der untergeordnete Prozess gleichzeitig mit dem übergeordneten Prozess mit dem Benutzer interagieren soll. Es wäre verwirrend zu versuchen, beides in einem einzigen Fenster zu tun.Beachten Sie, dass dies gefährlich ist, da der Befehl nicht bereinigt wird. Ich überlasse es Ihnen, bei Google nach der entsprechenden Dokumentation zu den Modulen 'os' und 'sys' zu suchen. Es gibt eine Reihe von Funktionen (exec * und spawn *), die ähnliche Aufgaben ausführen.
quelle
subprocess
als etwas vielseitigere und tragbarere Lösung gelten. Das Ausführen externer Befehle ist natürlich von Natur aus nicht portierbar (Sie müssen sicherstellen, dass der Befehl in jeder Architektur verfügbar ist, die Sie unterstützen müssen), und das Übergeben von Benutzereingaben als externer Befehl ist von Natur aus unsicher.Ich würde empfehlen , das mit Subprozess Modul statt os.system , weil es für Sie nicht Shell zu entkommen und ist daher viel sicherer.
quelle
subprocess
wennshell=False
, dann verwenden Sieshlex.split
für eine einfache Möglichkeit , dies zu tun docs.python.org/2/library/shlex.html#shlex.split ( Dies ist der empfohlene Weg gemäß den Dokumenten docs.python.org/2/library/subprocess.html#popen-constructor )Wenn Sie die Ergebnisse des Befehls zurückgeben möchten, können Sie verwenden
os.popen
. Dies ist jedoch seit Version 2.6 zugunsten des Unterprozessmoduls veraltet , was andere Antworten gut abgedeckt haben.quelle
Es gibt viele verschiedene Bibliotheken, mit denen Sie externe Befehle mit Python aufrufen können. Für jede Bibliothek habe ich eine Beschreibung gegeben und ein Beispiel für das Aufrufen 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, die ich aufgelistet und die Dokumentation für jede Bibliothek verknüpft habe.Hoffentlich hilft Ihnen dies bei der Entscheidung, welche Bibliothek Sie verwenden möchten :)
Mit dem Unterprozess können Sie externe Befehle aufrufen und diese mit ihren Eingabe- / Ausgabe- / Fehlerleitungen (stdin, stdout und stderr) verbinden. Unterprozess ist die Standardauswahl zum Ausführen von Befehlen, aber manchmal sind andere Module besser.
os wird für "betriebssystemabhängige Funktionalität" verwendet. Es kann auch verwendet werden, um externe Befehle mit
os.system
und aufzurufenos.popen
(Hinweis: Es gibt auch einen subprocess.popen). os führt immer die Shell aus und ist eine einfache Alternative für Leute, die es nicht brauchen oder nicht wissen, wie man es benutztsubprocess.run
.sh ist eine Unterprozessschnittstelle, mit der Sie Programme aufrufen können, als wären sie Funktionen. Dies ist nützlich, wenn Sie einen Befehl mehrmals ausführen möchten.
plumbum ist eine Bibliothek für "script-like" Python-Programme. Sie können Programme wie Funktionen wie in aufrufen
sh
. Plumbum ist nützlich, wenn Sie eine Pipeline ohne Shell ausführen möchten.Mit pexpect können Sie untergeordnete Anwendungen erzeugen, steuern und Muster in ihrer Ausgabe finden. Dies ist eine bessere Alternative zum Unterprozess für Befehle, die unter Unix eine tty erwarten.
Fabric ist eine Python 2.5- und 2.7-Bibliothek. Hier können Sie lokale und Remote-Shell-Befehle ausführen. Fabric ist eine einfache Alternative zum Ausführen von Befehlen in einer sicheren Shell (SSH).
Gesandter ist als "Unterprozess für den Menschen" bekannt. Es wird als Convenience-Wrapper um das
subprocess
Modul verwendet.commands
enthält Wrapper-Funktionen füros.popen
, wurde jedoch aus Python 3 entfernt, da diessubprocess
eine bessere Alternative darstellt.Die Bearbeitung basierte auf dem Kommentar von JF Sebastian.
quelle
Ich benutze immer
fabric
für diese Dinge wie:Dies scheint jedoch ein gutes Werkzeug zu sein:
sh
(Python-Subprozessschnittstelle) .Schauen Sie sich ein Beispiel an:
quelle
Überprüfen Sie auch die Python-Bibliothek "pexpect".
Es ermöglicht die interaktive Steuerung externer Programme / Befehle, sogar von SSH, FTP, Telnet usw. Sie können einfach Folgendes eingeben:
quelle
Mit der Standardbibliothek
Verwenden Sie das Unterprozessmodul (Python 3):
Dies ist der empfohlene Standardweg. Kompliziertere Aufgaben (Pipes, Ausgabe, Eingabe usw.) können jedoch mühsam zu konstruieren und zu schreiben sein.
Hinweis zur Python-Version: Wenn Sie noch Python 2 verwenden, funktioniert subprocess.call auf ähnliche Weise.
ProTip: shlex.split kann Ihnen helfen, den Befehl für und andere Funktionen zu analysieren
run
, falls Sie diese nicht in Form von Listen bereitstellen möchten (oder können!).call
subprocess
Mit externen Abhängigkeiten
Wenn Ihnen externe Abhängigkeiten nichts ausmachen, verwenden Sie plumbum :
Es ist die beste
subprocess
Verpackung. Es ist plattformübergreifend, dh es funktioniert sowohl auf Windows- als auch auf Unix-ähnlichen Systemen. Installieren vonpip install plumbum
.Eine weitere beliebte Bibliothek ist sh :
Die
sh
Windows-Unterstützung wurde jedoch eingestellt, sodass sie nicht mehr so beeindruckend ist wie früher. Installieren vonpip install sh
.quelle
Wenn Sie die Ausgabe des Befehls müssen Sie anrufen, dann können Sie verwenden subprocess.check_output (Python 2.7+).
Beachten Sie auch den Shell- Parameter.
quelle
check_output
dass eine Liste anstelle einer Zeichenfolge erforderlich ist. Wenn Sie sich nicht auf Anführungszeichen verlassen, um Ihren Anruf gültig zu machen, ist dies am einfachsten und am besten lesbarsubprocess.check_output("ls -l /dev/null".split())
.So führe ich meine Befehle aus. Dieser Code enthält alles, was Sie brauchen
quelle
Aktualisieren:
subprocess.run
ist der empfohlene Ansatz ab Python 3.5, wenn Ihr Code nicht mit früheren Python-Versionen kompatibel sein muss. Es ist konsistenter und bietet eine ähnliche Benutzerfreundlichkeit wie Envoy. (Rohrleitungen sind jedoch nicht so einfach. In dieser Frage erfahren Sie, wie .)Hier einige Beispiele aus der Dokumentation .
Führen Sie einen Prozess aus:
Bei fehlgeschlagenem Lauf erhöhen:
Ausgabe erfassen:
Ursprüngliche Antwort:
Ich empfehle Envoy zu versuchen . Es ist ein Wrapper für Unterprozesse, der wiederum die älteren Module und Funktionen ersetzen soll . Gesandter ist ein Unterprozess für Menschen.
Anwendungsbeispiel aus der README :
Pipe Zeug auch herum:
quelle
Verwenden subprocess .
... oder für einen sehr einfachen Befehl:
quelle
os.system
ist in Ordnung, aber irgendwie veraltet. Es ist auch nicht sehr sicher. Versuchen Sie es stattdessensubprocess
.subprocess
ruft sh nicht direkt an und ist daher sicherer alsos.system
.Weitere Informationen erhalten Sie hier .
quelle
subprocess
behebe jedoch nicht alle Sicherheitsprobleme und habe einige lästige Probleme.Einfach, verwenden
subprocess.run
, was einCompletedProcess
Objekt zurückgibt :Warum?
Ab Python 3.5 wird in der Dokumentation subprocess.run empfohlen :
Hier ist ein Beispiel für die einfachste Verwendung - und es funktioniert genau so, wie es verlangt wird:
run
Wartet, bis der Befehl erfolgreich abgeschlossen wurde, und gibt dann einCompletedProcess
Objekt zurück. Es kann stattdessen erhöhenTimeoutExpired
(wenn Sie ihm eintimeout=
Argument geben) oderCalledProcessError
(wenn es fehlschlägt und Sie bestehencheck=True
).Wie Sie dem obigen Beispiel entnehmen können, werden stdout und stderr standardmäßig an Ihr eigenes stdout und stderr weitergeleitet.
Wir können das zurückgegebene Objekt untersuchen und den Befehl und den Rückkehrcode sehen:
Ausgabe erfassen
Wenn Sie die Ausgabe erfassen möchten, können Sie
subprocess.PIPE
an die entsprechende übergebenstderr
oderstdout
:(Ich finde es interessant und etwas eingängig, dass die Versionsinformationen auf stderr anstatt auf stdout gesetzt werden.)
Übergeben Sie eine Befehlsliste
Man könnte leicht von der manuellen Bereitstellung einer Befehlszeichenfolge (wie in der Frage vorgeschlagen) zur Bereitstellung einer programmgesteuert erstellten Zeichenfolge übergehen. Erstellen Sie keine Zeichenfolgen programmgesteuert. Dies ist ein potenzielles Sicherheitsproblem. Es ist besser anzunehmen, dass Sie der Eingabe nicht vertrauen.
Beachten Sie, dass nur
args
positionell übergeben werden sollte.Vollständige Unterschrift
Hier ist die tatsächliche Signatur in der Quelle und wie gezeigt durch
help(run)
:Die
popenargs
undkwargs
werden demPopen
Konstruktor gegeben.input
kann eine Zeichenfolge von Bytes sein (oder Unicode, wenn Codierung angegeben ist oderuniversal_newlines=True
), die an das stdin des Unterprozesses weitergeleitet wird.Die Dokumentation beschreibt
timeout=
undcheck=True
besser als ich könnte:und dieses Beispiel für
check=True
ist besser als eines, das ich mir einfallen lassen könnte:Erweiterte Signatur
Hier ist eine erweiterte Signatur, wie in der Dokumentation angegeben:
Beachten Sie, dass dies darauf hinweist, dass nur die Args-Liste positionell übergeben werden sollte. Übergeben Sie also die verbleibenden Argumente als Schlüsselwortargumente.
Popen
Wann
Popen
stattdessen verwenden? Ich würde mich bemühen, einen Anwendungsfall allein aufgrund der Argumente zu finden. Die direkte Verwendung vonPopen
würde Ihnen jedoch Zugriff auf seine Methoden gewähren, einschließlichpoll
'send_signal', 'terminate' und 'wait'.Hier ist die
Popen
Unterschrift wie in der Quelle angegeben . Ich denke, dies ist die genaueste Kapselung der Informationen (im Gegensatz zuhelp(Popen)
):Informativer ist jedoch die
Popen
Dokumentation :Das Verständnis der verbleibenden Dokumentation
Popen
wird dem Leser als Übung überlassen.quelle
shell=True
den Befehl als Liste oder (noch besser) übergeben.Es gibt auch Plumbum
quelle
Verwenden:
os - Dieses Modul bietet eine tragbare Möglichkeit, betriebssystemabhängige Funktionen zu verwenden.
Für die weiteren
os
Funktionen finden Sie hier die Dokumentation.quelle
So einfach kann es sein:
quelle
os.system
ausdrücklich empfohlen, dies zugunsten von zu vermeidensubprocess
.Ich mag shell_command wegen seiner Einfachheit. Es basiert auf dem Unterprozessmodul.
Hier ist ein Beispiel aus der Dokumentation:
quelle
Es gibt hier einen weiteren Unterschied, der zuvor nicht erwähnt wurde.
subprocess.Popen
führt den <Befehl> als Unterprozess aus. In meinem Fall muss ich die Datei <a> ausführen, die mit einem anderen Programm <b> kommunizieren muss.Ich habe versucht, einen Unterprozess durchzuführen, und die Ausführung war erfolgreich. <b> konnte jedoch nicht mit <a> kommunizieren. Alles ist normal, wenn ich beide vom Terminal aus starte.
Noch eines: (HINWEIS: kwrite verhält sich anders als andere Anwendungen. Wenn Sie das Folgende mit Firefox versuchen, sind die Ergebnisse nicht dieselben.)
Wenn Sie es versuchen
os.system("kwrite")
, friert der Programmfluss ein, bis der Benutzer kwrite schließt. Um das zu überwinden, habe ich stattdessen versuchtos.system(konsole -e kwrite)
. Dieses Mal floss das Programm weiter, aber kwrite wurde zum Unterprozess der Konsole.Jeder führt das kwrite nicht als Unterprozess aus (dh im Systemmonitor muss es am linken Rand des Baums angezeigt werden).
quelle
os.system
erlaubt Ihnen nicht, Ergebnisse zu speichern. Wenn Sie also Ergebnisse in einer Liste oder etwas anderem speichern möchten,subprocess.call
funktioniert a.quelle
subprocess.check_call
ist praktisch, wenn Sie keine Rückgabewerte testen möchten. Bei jedem Fehler wird eine Ausnahme ausgelöst.quelle
Ich neige dazu verwenden subprocess zusammen mit shlex (zu handhaben von Strings in Anführungszeichen zu entkommen):
quelle
Schamloser Plug, ich habe eine Bibliothek dafür geschrieben: P https://github.com/houqp/shell.py
Es ist im Grunde ein Wrapper für Popen und Shlex für jetzt. Es werden auch Piping-Befehle unterstützt, sodass Sie Befehle in Python einfacher verketten können. So können Sie Dinge tun wie:
quelle
In Windows können Sie nur das Import -
subprocess
Modul und externe Befehle ausgeführt durch den Aufrufsubprocess.Popen()
,subprocess.Popen().communicate()
undsubprocess.Popen().wait()
wie unten:Ausgabe:
quelle
Wenn Sie unter Linux einen externen Befehl aufrufen möchten, der unabhängig ausgeführt wird (der nach Beendigung des Python-Skripts weiter ausgeführt wird), können Sie eine einfache Warteschlange als Task-Spooler oder als at verwenden Befehl verwenden
Ein Beispiel mit Task-Spooler:
Hinweise zum Task-Spooler (
ts
):Sie können die Anzahl der gleichzeitig auszuführenden Prozesse ("Slots") festlegen mit:
ts -S <number-of-slots>
Für die Installation sind
ts
keine Administratorrechte erforderlich. Sie können es einfach herunterladen und aus dem Quellcode kompilierenmake
, es Ihrem Pfad hinzufügen und fertig.quelle
ts
ist in keiner mir bekannten Distribution Standard, obwohl der Zeiger aufat
leicht nützlich ist. Sie sollten wahrscheinlich auch erwähnenbatch
. Wie überall sollte in deros.system()
Empfehlung wahrscheinlich zumindest erwähnt werden, dasssubprocess
es sich um den empfohlenen Ersatz handelt.Sie können Popen verwenden und anschließend den Status der Prozedur überprüfen:
Check out subprocess.Popen .
quelle
So rufen Sie die Netzwerk-ID vom OpenStack Neutron ab :
Ausgabe der Nova-Netzliste
Ausgabe von print (NetworkID)
quelle
os.popen()
2016 nicht empfehlen . Das Awk-Skript kann leicht durch nativen Python-Code ersetzt werden.