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

18voto

kanghyojmun Punkte 350

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 .

17voto

IRSHAD Punkte 2559

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

0 Stimmen

Sie sollten nicht empfehlen os.popen() im Jahr 2016. Das Awk-Skript könnte leicht durch nativen Python-Code ersetzt werden.

15voto

Garfield Punkte 2337

Der einfachste Weg, einen Befehl auszuführen und das Ergebnis zu erhalten:

from commands import getstatusoutput

try:
    return getstatusoutput("ls -ltr")
except Exception, e:
    return None

6 Stimmen

Wird dies in Python 3.0 veraltet sein?

4 Stimmen

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.

14voto

N.Nonkovic Punkte 622

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)

13voto

am5 Punkte 2336

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

1 Stimmen

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

1 Stimmen

@sbk repr(arg) hat nicht wirklich geholfen, der obige Code kann auch mit Leerzeichen umgehen. Jetzt funktioniert das Folgende exec_long_running_proc(command = "ls", args=["-l", "~/test file*"])

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