Python Script ejecuta comandos en la Terminal

109

Leí esto en alguna parte hace un tiempo pero parece que no puedo encontrarlo. Estoy tratando de encontrar un comando que ejecute comandos en el terminal y luego genere el resultado.

Por ejemplo: el guión será:

command 'ls -l'

Saldrá el resultado de ejecutar ese comando en la terminal

Ali
fuente

Respuestas:

198

Hay varias formas de hacer esto:

Una forma sencilla es usar el módulo os:

import os
os.system("ls -l")

Se pueden lograr cosas más complejas con el módulo de subproceso: por ejemplo:

import subprocess
test = subprocess.Popen(["ping","-W","2","-c", "1", "192.168.1.70"], stdout=subprocess.PIPE)
output = test.communicate()[0]
Uku Loskit
fuente
43
No quiero menospreciarte, pero. Deberías usar subproceso para todo. Es mucho más seguro. subprocess.call () le proporcionará una interfaz agradable para reemplazar el formulario de llamada simple.
Jorge Vargas
Gracias por esa respuesta amigo. Usaré Python para mi primera aplicación en el escritorio de Ubuntu, esto realmente me ayudará.
LinuxBill
1
¿Cómo puedo obtener la respuesta completa de un comando? os.system("nslookup gmail.com")Solo devuelve la última línea 0, pero quiero obtener la respuesta completa.
Parthapratim Neog
3
@JorgeVargas ¿Puedes ayudarme a entender por qué se debe usar el subproceso para todo? ¿Por qué es más seguro?
Soutzikevich
38

Prefiero el uso del módulo de subproceso:

from subprocess import call
call(["ls", "-l"])

La razón es que si desea pasar alguna variable en el script, esto le brinda una forma muy fácil, por ejemplo, tome la siguiente parte del código

abc = a.c
call(["vim", abc])
Kevin Pandya
fuente
Me funcionó bien al abrir una imagen con parámetros adicionalescall(["eog", "1breeproposal.png", "-f"])
Josh
4

También deberías mirar en los comandos.getstatusoutput

Esto devuelve una tupla de longitud 2. El primero es el entero devuelto (0 - cuando los comandos son exitosos) el segundo es la salida completa como se mostrará en la terminal.

Para ls

    import commands
    s=commands.getstatusoutput('ls')
    print s
    >> (0, 'file_1\nfile_2\nfile_3')
    s[1].split("\n")
    >> ['file_1', 'file_2', 'file_3']
minocha
fuente
2
import os
os.system("echo 'hello world'")

Esto debería funcionar. No sé cómo imprimir la salida en Python Shell.

Mr_pzling_Pie
fuente
1

Jupyter

En un cuaderno jupyter puede utilizar la función mágica !

!echo "execute a command"
files = !ls -a /data/dir/ #get the output into a variable

ipython

Para ejecutar esto como un .pyscript, necesitaría usaripython

files = get_ipython().getoutput('ls -a /data/dir/')

ejecutar script

$ ipython my_script.py
Zephro
fuente
0

Puede importar el módulo 'os' y usarlo así:

import os
os.system('#DesiredAction')
Kobe Keirouz
fuente
0

para python3 use subproceso

import subprocess
s = subprocess.getstatusoutput(f'ps -ef | grep python3')
print(s)
Avi Avidan
fuente