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 bashu otro shell si no especifica el shellargumento 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()
¿Se recomienda usar ( os.popeno os.system), por ejemplo res = os.popen('sudo apt update').read():? @Anthon
Alper
1
@alper Leer 0324 python.org/dev/peps/pep-0324 . Eso explica la razón de hacer subprocessaunque os.system, y os.popenya 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 subprocessha mejorado desde 2003, los otros todavía están allí para la compatibilidad con versiones anteriores. ¿Ha leído la os.systempá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.
Anthon
1
@alper Sí, podrías. Como indiqué, es un peligro potencial para la seguridad, así que no sé por qué crees que se recomienda. Invocar sudosolo lo hará más severo. Quizás usar python-apt sea una mejor solución (no lo he investigado yo mismo).
Anthon
1
@alper en ese caso eche un vistazo serio al plumbum , vale la pena ponerse al día con eso.
Anthon
1
@alper Si está en Python3, debe hacerlo, en Python2 no. No utilices los comentarios aquí como un sistema de chat. Si tiene alguna pregunta, publíquela como tal.
Anthon
8
Es posible que use bash como programa, con el parámetro -c para ejecutar los comandos:
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:
esto me dio el siguiente rastreo: 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)
Dremor
3
Olvidaste los corchetes
Milind Dumbare
1
También tenga en cuenta que subprocess.call()está bloqueando mientras subprocess.Popen()que no está bloqueando ..
heemayl
¿Qué quieres decir con "bloqueo"? @heemayl
Alper
2
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 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
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:check_output
arroja un error al salir en cero del comando invocadoTenga en cuenta que esto no invoca
bash
u otro shell si no especifica elshell
argumento de la palabra clave para la función (lo mismo es cierto parasubprocess.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:
fuente
os.popen
oos.system
), por ejemplores = os.popen('sudo apt update').read()
:? @Anthonsubprocess
aunqueos.system
, yos.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. Ysubprocess
ha mejorado desde 2003, los otros todavía están allí para la compatibilidad con versiones anteriores. ¿Ha leído laos.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:
fuente
El módulo de subproceso está diseñado para hacer esto:
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:fuente
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 mientrassubprocess.Popen()
que no está bloqueando ..También puedes usar 'os.popen'.
Ejemplo:
Salida:
fuente
utilizar módulo de subproceso
fuente