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

33voto

Samadi Salahedine Punkte 517

Es kann so einfach sein:

import os
cmd = "your command"
os.system(cmd)

2 Stimmen

Dabei wird nicht auf die Nachteile hingewiesen, die viel ausführlicher in PEP-324 . Die Dokumentation für os.system empfiehlt ausdrücklich, sie zu vermeiden zugunsten von subprocess .

27voto

Saurabh Bangad Punkte 377

os.system erlaubt es nicht, Ergebnisse zu speichern. Wenn Sie also Ergebnisse in einer Liste oder ähnlichem speichern wollen, muss eine subprocess.call funktioniert.

27voto

Atinc Delican Punkte 285

Hier gibt es noch einen weiteren Unterschied, der bisher 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 es mit subprocess versucht, und die Ausführung war erfolgreich. Allerdings konnte <b> nicht mit <a> kommunizieren. Alles ist normal, wenn ich beide über das Terminal ausführe.

Noch eine: (HINWEIS: kwrite verhält sich anders als andere Anwendungen. Wenn Sie das Folgende mit Firefox ausprobieren, werden die Ergebnisse nicht die gleichen sein).

Wenn Sie versuchen os.system("kwrite") bleibt der Programmablauf stehen, bis der Benutzer kwrite schließt. Um das zu umgehen, habe ich stattdessen versucht os.system(konsole -e kwrite) . Diesmal lief das Programm weiter, aber kwrite wurde zum Unterprozess der Konsole.

Jeder, der kwrite ausführt, darf kein Unterprozess sein (d.h. im Systemmonitor muss er am linken Rand des Baums erscheinen).

1 Stimmen

Was meinen Sie mit "Jeder führt das kwrite nicht als Unterprozess aus" ?

0 Stimmen

Es ist in der Tat verwunderlich, dass subprocess führt einen Unterprozess aus.

25voto

cdunn2001 Punkte 16591

subprocess.check_call ist praktisch, wenn Sie die Rückgabewerte nicht testen wollen. Bei einem Fehler wird eine Ausnahme ausgelöst.

25voto

Emil Stenström Punkte 11959

Ich neige dazu, die Unterprozess zusammen mit shlex (um das Escaping von Zeichenketten in Anführungszeichen zu behandeln):

>>> import subprocess, shlex
>>> command = 'ls -l "/your/path/with spaces/"'
>>> call_params = shlex.split(command)
>>> print call_params
["ls", "-l", "/your/path/with spaces/"]
>>> subprocess.call(call_params)

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