Risposte:
La risposta di @milne funziona, ma subprocess.call()
ti dà pochi feedback.
Preferisco usare in subprocess.check_output()
modo da poter analizzare ciò che è stato stampato su stdout:
import subprocess
res = subprocess.check_output(["sudo", "apt", "update"])
for line in res.splitlines():
# process the output line by line
check_output
genera un errore all'uscita zero del comando invocato
Si noti che questo non invoca bash
o un'altra shell se non si specifica l' shell
argomento della parola chiave per la funzione (lo stesso vale per subprocess.call()
, e non si dovrebbe se non necessario in quanto impone un rischio per la sicurezza), invoca direttamente il comando.
Se ti ritrovi a fare molte (diverse) invocazioni di comandi da Python, potresti voler guardare al plumbum . Con ciò puoi fare (IMO) più leggibile:
from plumbum.cmd import sudo, apt, echo, cut
res = sudo[apt["update"]]()
chain = echo["hello"] | cut["-c", "2-"]
chain()
os.popen
o os.system
), ad esempio res = os.popen('sudo apt update').read()
:? @Anthon
subprocess
, anche se os.system
e os.popen
già esisteva. Tali PEP non sono banali per essere accettati. Diverse persone ci hanno pensato molto più di quanto tu o io mai faremo. E subprocess
è migliorato dal 2003, gli altri sono ancora lì per compatibilità con le versioni precedenti. Hai rosso la os.system
pagina del manuale: il modulo di sottoprocesso fornisce strutture più potenti per generare nuovi processi e recuperare i loro risultati; usare quel modulo è preferibile usare questa funzione.
sudo
renderà solo più grave. Forse usare python-apt è una soluzione migliore (non l'ho analizzato da solo).
Il modulo di sottoprocesso è progettato per fare questo:
import subprocess
subprocess.call(["sudo", "apt", "update"])
Se desideri che lo script venga interrotto se il comando non riesce, potresti prendere in considerazione l'utilizzo check_call()
invece di analizzare tu stesso il codice di ritorno:
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
(sto usando yum come sto usando Fedora come sistema operativo principale)
subprocess.call()
sta bloccando mentre subprocess.Popen()
non sta bloccando ...
Inoltre puoi usare 'os.popen'.
Esempio:
import os
command = os.popen('ls -al')
print(command.read())
print(command.close())
Produzione:
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
usa il modulo sottoprocesso
import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())