Wie rufe ich einen externen Befehl in Python auf, als hätte ich ihn in einer Shell oder Eingabeaufforderung eingegeben?
Sie sollten nicht empfehlen os.popen()
im Jahr 2016. Das Awk-Skript könnte leicht durch nativen Python-Code ersetzt werden.
Wie rufe ich einen externen Befehl in Python auf, als hätte ich ihn in einer Shell oder Eingabeaufforderung eingegeben?
Sie können Popen verwenden und dann den Status des Verfahrens überprüfen:
from subprocess import Popen
proc = Popen(['ls', '-l'])
if proc.poll() is None:
proc.kill()
Überprüfen Sie subprocess.Popen .
Um die Netzwerk-ID aus dem OpenStack Neutron :
#!/usr/bin/python
import os
netid = "nova net-list | awk '/ External / { print $2 }'"
temp = os.popen(netid).read() /* Here temp also contains new line (\n) */
networkId = temp.rstrip()
print(networkId)
Ausgabe von nova net-list
+--------------------------------------+------------+------+
| ID | Label | CIDR |
+--------------------------------------+------------+------+
| 431c9014-5b5d-4b51-a357-66020ffbb123 | test1 | None |
| 27a74fcd-37c0-4789-9414-9531b7e3f126 | External | None |
| 5a2712e9-70dc-4b0e-9281-17e02f4684c9 | management | None |
| 7aa697f5-0e60-4c15-b4cc-9cb659698512 | Internal | None |
+--------------------------------------+------------+------+
Ausgabe von print(networkId)
27a74fcd-37c0-4789-9414-9531b7e3f126
In der Tat, die commands
Dokumentation von Python 2.7 sagt, dass es in 2.6 veraltet war und in 3.0 entfernt werden wird.
DEN MEISTEN FÄLLEN:
In den meisten Fällen reicht ein kurzer Codeschnipsel wie der folgende aus :
import subprocess
import shlex
source = "test.txt"
destination = "test_copy.txt"
base = "cp {source} {destination}'"
cmd = base.format(source=source, destination=destination)
subprocess.check_call(shlex.split(cmd))
Es ist sauber und einfach .
subprocess.check_call
Befehl mit Argumenten ausführen und warten auf Befehl zu beenden.
shlex.split
die Zeichenkette cmd mit einer Shell-ähnlichen Syntax aufteilen
DEN REST DER FÄLLE:
Wenn dies bei einem bestimmten Befehl nicht funktioniert, haben Sie wahrscheinlich ein Problem mit Kommandozeilen-Interpreter . Das Betriebssystem hat das Standardprogramm ausgewählt, das für Ihre Art von Programm nicht geeignet ist, oder es konnte kein geeignetes Programm im Pfad der ausführbaren Dateien des Systems gefunden werden.
Ejemplo:
Verwendung des Umleitungsoperators auf einem Unix-System
input_1 = "input_1.txt"
input_2 = "input_2.txt"
output = "merged.txt"
base_command = "/bin/bash -c 'cat {input} >> {output}'"
base_command.format(input_1, output=output)
subprocess.check_call(shlex.split(base_command))
base_command.format(input_2, output=output)
subprocess.check_call(shlex.split(base_command))
So heißt es in Das Zen der Python : Explizit ist besser als implizit
Wenn Sie also eine Python >=3.6 Funktion verwenden, würde es etwa so aussehen:
import subprocess
import shlex
def run_command(cmd_interpreter: str, command: str) -> None:
base_command = f"{cmd_interpreter} -c '{command}'"
subprocess.check_call(shlex.split(base_command)
Oft verwende ich die folgende Funktion für externe Befehle, und dies ist besonders praktisch für lang laufende Prozesse . Die folgende Methode Schwänze Prozessausgabe während es läuft und gibt die Ausgabe zurück, löst eine Ausnahme aus wenn der Prozess fehlschlägt.
Es kommt heraus, wenn der Prozess mit der poll()-Methode für den Prozess .
import subprocess,sys
def exec_long_running_proc(command, args):
cmd = "{} {}".format(command, " ".join(str(arg) if ' ' not in arg else arg.replace(' ','\ ') for arg in args))
print(cmd)
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
# Poll process for new output until finished
while True:
nextline = process.stdout.readline().decode('UTF-8')
if nextline == '' and process.poll() is not None:
break
sys.stdout.write(nextline)
sys.stdout.flush()
output = process.communicate()[0]
exitCode = process.returncode
if (exitCode == 0):
return output
else:
raise Exception(command, exitCode, output)
Sie können sie wie folgt aufrufen:
exec_long_running_proc(command = "hive", args=["-f", hql_path])
Sie werden unerwartete Ergebnisse erhalten, wenn Sie ein Argument mit Leerzeichen übergeben. Verwendung von repr(arg)
anstelle von str(arg)
könnte der bloße Zufall helfen, dass Python und sh Anführungszeichen auf dieselbe Weise entkommen
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.
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 mitimport subprocess; subprocess.run(["ls", "-l"])
.