Wenn Sie Shell-Befehle in Python verarbeiten möchten, verwenden Sie im Allgemeinen das Modul "Unterprozess". Es ist möglich, das Ergebnis als Liste mit stdout.readlines () im Modul zu übergeben. Wenn der auszuführende Shell-Befehl jedoch mehrere Zeilen umfasst, wird der Zeilenvorschubcode (Zeilenvorschub) zusammen übergeben. Um die Liste mit entferntem Zeilenvorschubcode (Zeilenvorschub) zu übergeben, sollte daher die folgende Verarbeitung durchgeführt werden.
Hier erklären wir anhand eines Beispiels für die Ausführung von ls -l
aus Python als Shell-Befehl.
Dieses Mal habe ich drei Skripte auf die folgenden drei Arten erstellt.
Tatsächlich ist das Ergebnisbeispiel, wenn ls -l
ausgeführt wird, wie folgt.
$ ls -l
total 12
-rwxr-xr-x 1 root root 260 Jun 16 18:48 res_cmd_lfeed.py
-rwxr-xr-x 1 root root 378 Jun 16 18:49 res_cmd_no_lfeed.py
-rwxr-xr-x 1 root root 247 Jun 16 18:48 res_cmd.py
Holen Sie sich das erste Array-Element von communic ()
.
res_cmd.py
#!/usr/bin/python
import subprocess
def res_cmd(cmd):
return subprocess.Popen(
cmd, stdout=subprocess.PIPE,
shell=True).communicate()[0]
def main():
cmd = ("ls -l")
print(res_cmd(cmd))
if __name__ == '__main__':
main()
Wie unten gezeigt, ist das Ausführungsergebnis des Skripts dasselbe wie bei der Ausführung von ls -l
.
$ ./res_cmd.py
total 12
-rwxr-xr-x 1 root root 260 Jun 16 18:48 res_cmd_lfeed.py
-rwxr-xr-x 1 root root 378 Jun 16 18:49 res_cmd_no_lfeed.py
-rwxr-xr-x 1 root root 247 Jun 16 18:48 res_cmd.py
Verwenden Sie stdout.readlines ()
.
res_cmd_lfeed.py
#!/usr/bin/python
import subprocess
def res_cmd_lfeed(cmd):
return subprocess.Popen(
cmd, stdout=subprocess.PIPE,
shell=True).stdout.readlines()
def main():
cmd = ("ls -l")
print(res_cmd_lfeed(cmd))
if __name__ == '__main__':
main()
Sie können eine Liste der Ergebnisse erhalten, die Zeilenvorschübe enthalten.
$ ./res_cmd_lfeed.py
['total 12\n', '-rwxr-xr-x 1 root root 261 Jun 16 18:52 res_cmd_lfeed.py\n', '-rwxr-xr-x 1 root root 380 Jun 16 18:52 res_cmd_no_lfeed.py\n', '-rwxr-xr-x 1 root root 248 Jun 16 18:51 res_cmd.py\n']
Verwenden Sie "stdout.readlines ()" und "rstrip (" \ n ")" in der Listeneinschlussnotation.
res_cmd_no_lfeed.py
#!/usr/bin/python
import subprocess
def res_cmd_lfeed(cmd):
return subprocess.Popen(
cmd, stdout=subprocess.PIPE,
shell=True).stdout.readlines()
def res_cmd_no_lfeed(cmd):
return [str(x).rstrip("\n") for x in res_cmd_lfeed(cmd)]
def main():
cmd = ("ls -l")
print(res_cmd_no_lfeed(cmd))
if __name__ == '__main__':
main()
Sie können eine Ergebnisliste ohne Zeilenvorschub erhalten.
$ ./res_cmd_no_lfeed.py
['total 12', '-rwxr-xr-x 1 root root 261 Jun 16 18:52 res_cmd_lfeed.py', '-rwxr-xr-x 1 root root 380 Jun 16 18:52 res_cmd_no_lfeed.py', '-rwxr-xr-x 1 root root 248 Jun 16 18:51 res_cmd.py']