Antworten:
@ Milnes Antwort funktioniert, subprocess.call()
gibt Ihnen aber wenig Rückmeldung.
Ich bevorzuge die Verwendung, subprocess.check_output()
damit Sie analysieren können, was auf stdout gedruckt wurde:
import subprocess
res = subprocess.check_output(["sudo", "apt", "update"])
for line in res.splitlines():
# process the output line by line
check_output
Löst beim Beenden des aufgerufenen Befehls bei Null einen Fehler aus
Beachten Sie, dass dies nicht aufgerufen wird bash
oder eine andere Shell, wenn Sie das shell
Schlüsselwortargument für die Funktion nicht angeben (dasselbe gilt für subprocess.call()
und sollten Sie nicht, wenn dies nicht erforderlich ist, da dies ein Sicherheitsrisiko darstellt), die direkt aufruft Befehl.
Wenn Sie feststellen, dass Sie viele (verschiedene) Befehlsaufrufe aus Python ausführen, sollten Sie sich Plumbum ansehen . Damit können Sie die (IMO) lesbarer machen:
from plumbum.cmd import sudo, apt, echo, cut
res = sudo[apt["update"]]()
chain = echo["hello"] | cut["-c", "2-"]
chain()
os.popen
oder os.system
) zu verwenden, zB res = os.popen('sudo apt update').read()
:? @Anthon
subprocess
obwohl os.system
und os.popen
bereits existierten. Solche PEPs sind nicht trivial, um akzeptiert zu werden. Einige Leute haben viel mehr darüber nachgedacht, als Sie oder ich es jemals tun werden. Und subprocess
hat sich seit 2003 verbessert, die anderen sind nur noch da für die Abwärtskompatibilität. Haben Sie die os.system
Handbuchseite bereits aktualisiert? Das Unterprozessmodul bietet leistungsstärkere Funktionen, um neue Prozesse zu erstellen und deren Ergebnisse abzurufen. Die Verwendung dieses Moduls ist der Verwendung dieser Funktion vorzuziehen.
sudo
wenn man sich auf etwas beruft, wird das nur noch schlimmer. Vielleicht ist die Verwendung von Python-Apt eine bessere Lösung (das habe ich selbst nicht untersucht).
Das Subprozessmodul ist dazu ausgelegt:
import subprocess
subprocess.call(["sudo", "apt", "update"])
Wenn Sie möchten, dass das Skript beendet wird, wenn der Befehl fehlschlägt, sollten Sie in Betracht ziehen, check_call()
den Rückkehrcode selbst zu analysieren , anstatt ihn zu verwenden:
subprocess.check_call(["sudo", "apt", "update"])
Traceback (most recent call last): File "/home/Dremor/test.py", line 3, in <module> subprocess.call('sudo', 'yum', 'update') File "/usr/lib64/python3.4/subprocess.py", line 537, in call with Popen(*popenargs, **kwargs) as p: File "/usr/lib64/python3.4/subprocess.py", line 767, in __init__ raise TypeError("bufsize must be an integer") TypeError: bufsize must be an integer
(Ich verwende Yum, da ich Fedora als Hauptbetriebssystem verwende)
subprocess.call()
blockiert wird, während subprocess.Popen()
nicht blockiert wird ..
Sie können auch 'os.popen' verwenden.
Beispiel:
import os
command = os.popen('ls -al')
print(command.read())
print(command.close())
Ausgabe:
total 16
drwxr-xr-x 2 root root 4096 ago 13 21:53 .
drwxr-xr-x 4 root root 4096 ago 13 01:50 ..
-rw-r--r-- 1 root root 1278 ago 13 21:12 bot.py
-rw-r--r-- 1 root root 77 ago 13 21:53 test.py
None
Subprozessmodul verwenden
import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())