2012-03-16 34 views
7

Necesito ejecutar este comando linux desde python y asignar el resultado a una variable.Ejecutando un comando linux desde python

ps -ef | grep rtptransmit | grep -v grep 

He intentado utilizar la biblioteca de comandos de pitones para hacerlo.

import commands 
a = commands.getoutput('ps -ef | grep rtptransmit | grep -v grep') 

Pero a consigue el final del corte. La salida que recibo es:

'nvr  20714 20711 0 10:39 ?  00:00:00 /opt/americandynamics/venvr/bin/rtptransmit setup_req db=media camera=6 stream=video substream=1 client_a' 

pero el resultado esperado es:

nvr  20714 20711 0 10:39 ?  00:00:00 /opt/americandynamics/venvr/bin/rtptransmit setup_req db=media camera=6 stream=video substream=1 client_address=192.168.200.179 client_rtp_port=6970 override_lockout=1 clienttype=1 

¿Alguien sabe cómo detener la salida queden cortadas o cualquiera puede sugerir otro método?

Respuesta

8

ps aparentemente limita su salida para encajar en la presunta anchura de la terminal. Puede anular este ancho con la variable de entorno $COLUMNS o con la opción --columns al ps.

El módulo commands está en desuso. Use subprocess para obtener la salida de ps -ef y filtre la salida en Python. No utilice shell=True según lo sugerido por otras respuestas, es simplemente superfluo en este caso:

ps = subprocess.Popen(['ps', '-ef', '--columns', '1000'], stdout=subprocess.PIPE) 
output = ps.communicate()[0] 
for line in output.splitlines(): 
    if 'rtptransmit' in line: 
     print(line) 

También es posible que desee tomar un comando pgrep por el cual se puede buscar directamente los procesos específicos buscar.

3

Normalmente utilizo subprocess para ejecutar un comando externo. Para su caso, se puede hacer algo como lo siguiente

from subprocess import Popen, PIPE 

p = Popen('ps -ef | grep rtptransmit | grep -v grep', shell=True, 
      stdout=PIPE, stderr=PIPE) 
out, err = p.communicate() 

La salida será en out variable.

+1

-1 para el uso inútil de 'grep' y' shell = True'. – lunaryorn

+0

El 'shell' es necesario si desea utilizar pipe en el comando. Acerca del 'grep', en realidad solo copié y pegué el comando de la pregunta. Ese segundo 'grep' sospecho que está ahí porque a veces el comando' grep' que ejecutamos también parece ser grep-ed y, por lo tanto, debe eliminarse. Esto en realidad se puede evitar usando 'grep [r] tptransmit' – fajran

+0

Sé que' shell = True' es necesario para usar un conducto en el comando, y que el segundo 'grep' es para eliminar el primer comando' grep' del lista de procesos filtrados Pero ambos, el tubo y 'grep' son superfluos en este caso. – lunaryorn

4

commands está obsoleto, no debe usarlo. Utilice subprocess lugar

import subprocess 
a = subprocess.check_output('ps -ef | grep rtptransmit | grep -v grep', shell=True) 
+2

-1 para el uso inútil de 'grep' y' shell = True'. – lunaryorn

+0

@lunaryorn: la pregunta es cómo ejecutar ese comando en Python, no cómo grep eso en Python. – vartec

+0

En realidad, la pregunta es cómo evitar el truncamiento de la salida 'ps'. Pero eso no contradice mi punto ... – lunaryorn

Cuestiones relacionadas