Respuestas:
La respuesta de @ milne funciona, pero subprocess.call()
le da pocos comentarios.
Prefiero usar subprocess.check_output()
para que pueda analizar lo que se imprimió en stdout:
import subprocess
res = subprocess.check_output(["sudo", "apt", "update"])
for line in res.splitlines():
# process the output line by line
check_output
arroja un error al salir en cero del comando invocado
Tenga en cuenta que esto no invoca bash
u otro shell si no especifica el shell
argumento de la palabra clave para la función (lo mismo es cierto para subprocess.call()
, y no debería, si no es necesario, ya que impone un riesgo de seguridad), invoca directamente el mando.
Si te encuentras haciendo muchas invocaciones de comando (diferentes) de Python, es posible que desees mirar plumbum . Con eso puedes hacer la (IMO) más legible:
from plumbum.cmd import sudo, apt, echo, cut
res = sudo[apt["update"]]()
chain = echo["hello"] | cut["-c", "2-"]
chain()
os.popen
o os.system
), por ejemplo res = os.popen('sudo apt update').read()
:? @Anthon
subprocess
aunque os.system
, y os.popen
ya existía. Tales PEP no son triviales para ser aceptadas. Varias personas han pensado mucho más en eso de lo que tú o yo alguna vez lo haremos. Y subprocess
ha mejorado desde 2003, los otros todavía están allí para la compatibilidad con versiones anteriores. ¿Ha leído la os.system
página del manual? El módulo de subprocesos proporciona instalaciones más potentes para generar nuevos procesos y recuperar sus resultados; usar ese módulo es preferible a usar esta función.
sudo
solo lo hará más severo. Quizás usar python-apt sea una mejor solución (no lo he investigado yo mismo).
Es posible que use bash como programa, con el parámetro -c para ejecutar los comandos:
Ejemplo:
bashCommand = "sudo apt update"
output = subprocess.check_output(['bash','-c', bashCommand])
El módulo de subproceso está diseñado para hacer esto:
import subprocess
subprocess.call(["sudo", "apt", "update"])
Si desea que la secuencia de comandos finalice si el comando falla, puede considerar usar en check_call()
lugar de analizar el código de retorno usted mismo:
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
(estoy usando yum como estoy usando Fedora como SO principal)
subprocess.call()
está bloqueando mientras subprocess.Popen()
que no está bloqueando ..
También puedes usar 'os.popen'.
Ejemplo:
import os
command = os.popen('ls -al')
print(command.read())
print(command.close())
Salida:
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
utilizar módulo de subproceso
import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())