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 basho un'altra shell se non si specifica l' shellargomento 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.popeno os.system), ad esempio res = os.popen('sudo apt update').read():? @Anthon
subprocess, anche se os.systeme os.popengià 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.systempagina 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.
sudorenderà 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())