0

存在することがわかっている特定のファイルに対してfindコマンドを実行しています。ファイルがどこにあるかを知っているとは思わないので、そのファイルへのパスを取得したいと思います。私の理解では、stdoutをリダイレクトし、コマンドを実行して出力をキャプチャし、標準出力を再接続してから、結果を取得する必要があります。結果を取得するときに問題が発生します...結果を解読できません:

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'

私はこれをどうしたらいいのか分かりません。私が欲しかったのは、printコマンドが提供するもののようなものでした。

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

その出力をファイルを開くために使用できるようにするにはどうすればよいですか?印刷コマンドの結果を取得できれば、必要なファイルを開くことができます。

見当違いの場合は、質問の方向を変えてください。ありがとうございました!

4

1 に答える 1

2

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

外部コマンドの出力を取得するには、次を使用する必要があります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"))
于 2012-03-10T18:37:53.967 に答える