Odpowiedzi:
Odpowiedź @ milne działa, ale subprocess.call()
daje niewiele informacji zwrotnych.
Wolę używać subprocess.check_output()
, abyś mógł przeanalizować, co zostało wydrukowane na standardowe wyjście:
import subprocess
res = subprocess.check_output(["sudo", "apt", "update"])
for line in res.splitlines():
# process the output line by line
check_output
zgłasza błąd przy zerowym wyjściu z wywołanej komendy
Pamiętaj, że to nie wywołuje bash
ani innej powłoki, jeśli nie podasz shell
argumentu słowa kluczowego dla funkcji (to samo dotyczy subprocess.call()
, i nie powinieneś, jeśli nie jest to konieczne, ponieważ stanowi zagrożenie bezpieczeństwa), bezpośrednio wywołuje Komenda.
Jeśli zauważysz, że wykonujesz wiele (różnych) wywołań poleceń z Pythona, możesz przyjrzeć się pionowi . Dzięki temu możesz zrobić (IMO) bardziej czytelny:
from plumbum.cmd import sudo, apt, echo, cut
res = sudo[apt["update"]]()
chain = echo["hello"] | cut["-c", "2-"]
chain()
os.popen
lub os.system
), np .: res = os.popen('sudo apt update').read()
? @Anthon
subprocess
choć os.system
i os.popen
już istniał. Takie PEP nie są łatwe do zaakceptowania. Kilka osób zastanowiło się nad tym znacznie więcej niż ty lub ja. I subprocess
poprawił się od 2003 roku, pozostałe wciąż są dostępne dla kompatybilności wstecznej. Czy os.system
zredagowałeś stronę podręcznika: Moduł podprocesu zapewnia potężniejsze możliwości tworzenia nowych procesów i wyszukiwania ich wyników; korzystanie z tego modułu jest lepsze niż korzystanie z tej funkcji.
sudo
tylko pogorszy to. Może lepszym rozwiązaniem jest użycie python-apt (sam tego nie analizowałem).
Podproces moduł został zaprojektowany, aby to zrobić:
import subprocess
subprocess.call(["sudo", "apt", "update"])
Jeśli chcesz, aby skrypt zakończył się w przypadku niepowodzenia polecenia, możesz rozważyć użycie check_call()
zamiast samodzielnego analizowania kodu powrotu:
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
(używam yum, ponieważ używam Fedory jako głównego systemu operacyjnego)
subprocess.call()
blokuje się, a subprocess.Popen()
nie blokuje.
Możesz także użyć „os.popen”.
Przykład:
import os
command = os.popen('ls -al')
print(command.read())
print(command.close())
Wynik:
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
użyj modułu podprocesu
import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())