@ 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 bashoder eine andere Shell, wenn Sie das shellSchlü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()
Wird empfohlen ( os.popenoder os.system) zu verwenden, zB res = os.popen('sudo apt update').read():? @Anthon
alper
1
@alper Lesen Sie 0324 python.org/dev/peps/pep-0324 . Das erklärt die Gründe dafür, subprocessobwohl os.systemund os.popenbereits 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 subprocesshat sich seit 2003 verbessert, die anderen sind nur noch da für die Abwärtskompatibilität. Haben Sie die os.systemHandbuchseite 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.
Anthon
1
@alper Ja du könntest. Wie ich bereits angedeutet habe, dass dies ein potenzielles Sicherheitsrisiko darstellt, weiß ich nicht, warum dies Ihrer Meinung nach empfohlen wird. Und sudowenn 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).
Anthon
1
@alper in diesem Fall werfen Sie einen Blick auf Plumbum , es lohnt sich, sich damit vertraut zu machen .
Anthon
1
@alper Wenn Sie auf Python3 sind, müssen Sie das tun, auf Python2 nicht. Bitte benutze den Kommentar hier nicht als Chat-System. Wenn du eine Frage hast, poste sie als solche.
Anthon
8
Es ist möglich, dass Sie die Bash als Programm verwenden, mit dem Parameter -c, um die Befehle auszuführen:
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:
Dies gab mir den folgenden Traceback: 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)
Dremor
3
Sie haben die eckigen Klammern vergessen
Milind Dumbare
1
Beachten Sie auch, dass subprocess.call()blockiert wird, während subprocess.Popen()nicht blockiert wird ..
heemayl
Was meinst du mit "Sperren"? @heemayl
alper
2
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 1321:53.
drwxr-xr-x 4 root root 4096 ago 1301:50..-rw-r--r--1 root root 1278 ago 1321:12 bot.py
-rw-r--r--1 root root 77 ago 1321:53 test.py
None
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:check_output
Löst beim Beenden des aufgerufenen Befehls bei Null einen Fehler ausBeachten Sie, dass dies nicht aufgerufen wird
bash
oder eine andere Shell, wenn Sie dasshell
Schlüsselwortargument für die Funktion nicht angeben (dasselbe gilt fürsubprocess.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:
quelle
os.popen
oderos.system
) zu verwenden, zBres = os.popen('sudo apt update').read()
:? @Anthonsubprocess
obwohlos.system
undos.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. Undsubprocess
hat sich seit 2003 verbessert, die anderen sind nur noch da für die Abwärtskompatibilität. Haben Sie dieos.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).Es ist möglich, dass Sie die Bash als Programm verwenden, mit dem Parameter -c, um die Befehle auszuführen:
Beispiel:
quelle
Das Subprozessmodul ist dazu ausgelegt:
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:quelle
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ährendsubprocess.Popen()
nicht blockiert wird ..Sie können auch 'os.popen' verwenden.
Beispiel:
Ausgabe:
quelle
Subprozessmodul verwenden
quelle