2012-03-10 11 views
0

私が知っている特定のファイルに対してfindコマンドを実行しています。ファイルの場所を知っていると仮定したくないので、そのファイルへのパスを取得したいと思います。私の理解は、標準出力をリダイレクトし、コマンドを実行して出力をキャプチャし、標準出力を再接続し、結果を取得する必要があることです。問題は、私は結果を取得するとき...私はそれらを解読することはできません来る:プリントコマンドが使用されているかのように、標準出力メモリファイルを英語の文字列に変換します。

import os 
from cStringIO import StringIO 
stdout_backup = sys.stdout #Backup standard output 
stdout_output = StringIO() 
sys.stdout = stdout_output #Redirect standard output 
os.system("find . -name 'foobar.ext' -print") #Find a known file 
sys.stdout = stdout_backup #re-hook-up standard output as top priority 
paths_to_file = stdout_ouput.get_value() #Retrieve results 

私は私が望むことができるすべてのパスを見つけ、トラブルはそのpaths_to_file利回りですこの:

Out[9]: '\n\x01\x1b[0;32m\x02In [\x01\x1b[1;32m\x027\x01\x1b[0;32m\x02]: \x01\x1b[0m\x02\n\x01\x1b[0;32m\x02In [\x01\x1b[1;32m\x028\x01\x1b[0;32m\x02]: \x01\x1b[0m\x02' 

Iこれで何をするべきか分かりません。

./Work/Halpin Programs/Servers/selenium-server.jar 

がどのように私はその出力を使用可能にするか、ファイルを開くため:printコマンドが提供するもののようなものは何私が欲しかったですか? printコマンドが何を得ることができたら、私は自分が望むファイルを開くことができます。

私が間違っている場合は、質問の向きを変更してください。ありがとうございました!

答えて

2

sys.stdoutを変更してサブプロセスの出力を取り込むことはできません。あなたがキャプチャしたものは、インタラクティブなPythonインタプリタ(IPython?)からのA​​NSIエスケープシーケンスのようです。

外部コマンドの出力を取得するには、あなたがsubprocess.check_output()使用する必要があります。この特定のケースで

paths = subprocess.check_output(["find", ".", "-name", "foobar.ext"]) 

を、私は通常、すべての外部コマンドを呼び出すのではなく、ファイルを検索するos.walk()を使用していないだろうPythonのプロセス内の右から。

編集:ここではファイルを見つけるためos.walk()を使用する方法は次のとおりです。

def find(path, pattern): 
    for root, dirs, files in os.walk(path): 
     for match in fnmatch.filter(files, pattern): 
      yield os.path.join(root, match) 

paths = list(find(".", "foobar.ext")) 
+0

スヴェン、ご回答ありがとうございました。私はそれをテストしようとしている。あなたはos.walkを精巧に考えていますか? –

+0

華麗!ありがとう! –

関連する問題