2013-07-15 8 views
30

Voglio collegare l'output di ps -ef a python riga per riga.Come reindirizzare l'input a Python riga per riga dal programma linux?

Lo script che sto usando è questo (first.py) -

#! /usr/bin/python 

import sys 

for line in sys.argv: 
    print line 

Purtroppo, la "linea" viene diviso in parole separate da spazi bianchi. Così, per esempio, se faccio

echo "days go by and still" | xargs first.py 

l'output che ottengo è

./first.py 
days 
go 
by 
and 
still 

come scrivere lo script in modo tale che l'uscita è

./first.py 
days go by and still 

?

risposta

61

Non capisco perché si desidera utilizzare gli argomenti della riga di comando anziché leggere semplicemente dallo standard input. Python ha un semplice linguaggio per iterare su linee a stdin:

import sys 

for line in sys.stdin: 
    sys.stdout.write(line) 

mio esempio di utilizzo:

$ echo -e "first line\nsecond line" | python python_iterate_stdin.py 
first line 
second line 

Il tuo esempio di utilizzo:

$ echo "days go by and still" | python python_iterate_stdin.py 
days go by and still 
+0

Grazie per questa risposta. Avrei potuto contrassegnarlo come la risposta corretta, ma anche l'altra risposta era corretta ed è stata pubblicata per prima. – CodeBlue

+1

Giusto per chiarire: il tuo obiettivo è quello di leggere l'output standard di una riga del programma per linea con il tuo programma Python. Si sta utilizzando la riga di comando, si propone di utilizzare una pipe per trasferire l'output standard dal primo programma al secondo programma (che ha senso). E poi, invece di limitarsi a leggere dallo standard input nel tuo programma Python, preferisci includere un terzo programma nello stack che esegue una conversione magica dallo stdin agli argomenti della linea di comando ed eventualmente chiama il tuo programma Python più volte e frammenta l'input (fai sapere come funziona 'xargs'?)? –

+0

No, non so come funzionano gli xarg. – CodeBlue

1

Quello che vuoi è popen, il che lo rende possibile leggere direttamente l'output di un comando come si leggerà un file:

import os 
with os.popen('ps -ef') as pse: 
    for line in pse: 
     print line 
     # presumably parse line now 

Si noti che, se si desidera un parsing più complesso, è necessario esaminare la documentazione di subprocess.Popen.