2012-03-16 12 views
7

Ho bisogno di eseguire questo comando linux da python e assegnare l'output a una variabile.Esecuzione di un comando linux da python

ps -ef | grep rtptransmit | grep -v grep 

Ho provato a usare la libreria dei comandi python per farlo.

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

Ma a ottiene la fine del cut off. L'output che ottengo è:

'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' 

ma il risultato atteso è:

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 

Qualcuno sa come fermare l'uscita di ottenere tagliato o qualcuno può suggerire un altro metodo?

risposta

8

ps limita evidentemente la sua uscita per adattarsi alla larghezza presunta del terminale. È possibile sostituire questa larghezza con la variabile di ambiente $COLUMNS o con l'opzione --columns su ps.

Il modulo commands è obsoleto. Utilizzare subprocess per ottenere l'output di ps -ef e filtrare l'output in Python. Non utilizzare shell=True come suggerito da altre risposte, è semplicemente superfluo, in questo 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) 

Si consiglia inoltre di dare un'occhiata al comando pgrep con il quale è possibile cercare direttamente per i processi specifici.

3

Io di solito uso subprocess per l'esecuzione di un comando esterno. Per il vostro caso, si può fare qualcosa di simile alla seguente

from subprocess import Popen, PIPE 

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

L'uscita sarà in out variabile.

+1

-1 per l'uso inutile di 'grep' e' shell = True'. – lunaryorn

+0

La 'shell' è necessaria se si desidera utilizzare pipe nel comando. Riguardo a 'grep', in realtà ho appena copiato e incollato il comando dalla domanda. Quel secondo 'grep' sospetto ci sia perché a volte il comando' grep' che eseguiamo sembra anche essere grep-ed e quindi deve essere rimosso. Questo in realtà può essere evitato usando 'grep [r] tptransmit' – fajran

+0

So che' shell = True' è necessario per usare una pipe nel comando, e che il secondo 'grep' è quello di rimuovere il primo comando' grep' dal elenco dei processi filtrati. Ma entrambi, il tubo e 'grep' sono superflui in questo caso. – lunaryorn

4

commands è deprecato, non dovresti usarlo. Utilizzare subprocess invece

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

-1 per l'uso inutile di 'grep' e' shell = True'. – lunaryorn

+0

@lunaryorn: la domanda è come eseguire quel comando in Python, non come grep in Python. – vartec

+0

In realtà la domanda è come evitare il troncamento dell'output di 'ps'. Ma questo non contraddice il mio punto ... – lunaryorn

Problemi correlati