2013-07-15 7 views
30

ps -efの出力を行ごとにpythonにパイプしたいと思います。pythonへの入力をlinuxプログラムから行ごとにパイプする方法は?

私が使用しているスクリプトは、この(first.py)である - 残念ながら

#! /usr/bin/python 

import sys 

for line in sys.argv: 
    print line 

、「ライン」、空白で区切られた単語に分割されています。私は

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

を行うのであれば、例えば、私が手出力は、出力が

./first.py 
days go by and still 

あるようなスクリプトを書くためにどのように

./first.py 
days 
go 
by 
and 
still 

のですか?

答えて

61

標準入力からを単に読み込む代わりに、なぜコマンドライン引数を使用したいのかよく分かりません。 Pythonは標準入力で行を反復処理するための単純なイディオムを持っています

import sys 

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

私の使用例:

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

あなたの使用例:あなたが欲しい

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

この回答ありがとうございます。私はこれを正解としてマークすることができたが、他の答えも正しいものであり、最初に投稿された。 – CodeBlue

+1

あなたの目標は、あなたのPythonプログラムを使って1つのプログラムの標準出力を1行ずつ読むことです。コマンドラインを使用している場合は、パイプを使用して最初のプログラムから標準出力を2番目のプログラムに転送することを提案します(これは意味があります)。そして、あなたのPythonプログラムの標準入力から単純に読み込むのではなく、stdinからコマンドライン引数への魔法の変換を実行するスタックに3番目のプログラムを組み込み、おそらくPythonプログラムを複数回呼び出して入力を断片化します'xargs'の仕組みを知っていますか?) –

+0

いいえ、xargsの仕組みがわかりません。 – CodeBlue

1

はそれを作るされ、popenですあなたはファイルを読むようにコマンドの出力を直接読むことができます:

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

さらに複雑な解析が必要な場合は、subprocess.Popenのドキュメントを参照する必要があります。

関連する問題