1

PythonでRawTherapeeのプラグインを書いています。ディレクトリ ツリーのどこかに存在する「AboutThisBuild.txt」というファイルからバージョン番号を抽出する必要があります。RawTherapee はどこにインストールされているかを認識していますが、このデータはバイナリ ファイルに焼き付けられています。

使用しているプラ​​グインは、ショート サーキットのトラブルシューティングを目的として、コマンド ライン パラメーターを指定せずに実行すると、基本的なシステム データを収集するように設計されています。バージョン番号、リビジョン番号、および変更セット (別名 Mercurial) を取得することで、スクリプトが期待どおりに機能しない理由を整理できます。それがコンテキストです。

私はさまざまな方法を試しましたが、このサイトの他の場所で提案されたものもあります。主なものは os.walk と fnmatch の使用です。

問題は速度です。ディレクトリ ツリー全体を検索することは、塗料が乾くのを見るようなものです。

負荷を軽減するために、隠れている可能性が高い場所を予測し、これらの場所のみを通過するようにしました。これは高速ですが、一部のファイルが失われるという明らかな欠点があります。

これは私が現時点で持っているものです。ファイルがどこに配置されるかをまだ調査しているため、Linux ではテストされていますが、まだ Windows ではテストされていません。

import fnmatch
import os
import sys

rootPath = ('/usr/share/doc/rawtherapee',
            '~',
            '/media/CoreData/opt/',
            '/opt')
pattern = 'AboutThisBuild.txt'

# Return the first instance of RT found in the paths searched
for CheckPath in rootPath:
    print("\n")
    print(">>>>>>>>>>>>> " + CheckPath)
    print("\n")
    for root, dirs, files in os.walk(CheckPath, True, None, False):
        for filename in fnmatch.filter(files, pattern):
            print( os.path.join(root, filename))
            break

通常、「AboutThisBuild.txt」は「rawtherapee」と呼ばれるディレクトリ/サブディレクトリに保存されているか、ディレクトリ ツリーのどこかに文字列が含まれています。5000の奇妙なディレクトリ名を取得し、これらを「rawtherapee」で検索し、os.walkを使用してそれらのディレクトリをトラバースすることができましたが、私が見たすべてのモジュールと関数はディレクトリ内のすべてのファイルを照合することができました(再び)。

ディレクトリ ツリー全体をすばやく検索する方法を知っている人はいますか?それとも、このハイブリッド オプションにこだわっていますか?

4

3 に答える 3

0

検索に関することは、そこにたどり着く方法 (不正行為など) はあまり重要ではないということです。結果が得られたら、それが正しいことを比較的迅速に検証できます。

推測することで、かなり効率的に候補地を特定できる場合があります。たとえば、Linux では、最初にこれらの場所を調べてみることができます (明らかに、すべてがディレクトリであるとは限りませんが、害はありませんos.path.isfile('/;l$/AboutThisBuild.txt')) 。

$ strings /usr/bin/rawtherapee | grep '^/'
/lib/ld-linux.so.2
/H=!
/;l$
/9T$,
/.ba
/usr/share/rawtherapee
/usr/share/doc/rawtherapee
/themes/
/themes/slim
/options
/usr/share/color/icc
/cache
/languages/default
/languages/
/languages
/themes
/batch/queue
/batch/
/dcpprofiles
/@q=
/N6rtexif16NAISOInterpreterE

インストール済みの場合は、locateコマンドを試すことができます

それでも見つからない場合は、力ずくの方法に進みます

stringsこれは、 Python を使用する場合とほぼ同等です。

>>> from string import printable, whitespace
>>> from itertools import groupby
>>> pathchars = set(printable) - set(whitespace)
>>> with open("/usr/bin/rawtherapee") as fp:
...     data = fp.read()
... 
>>> for k, g in groupby(data, pathchars.__contains__):
...     if not k: continue
...     g = ''.join(g)
...     if len(g) > 3 and g.startswith("/"):
...         print g
... 
/lib64/ld-linux-x86-64.so.2
/^W0Kq[
/pW$<
/3R8
/)wyX
/WUO
/w=H
/t_1
/.badpixH
/d$(
/\$P
/D$Pv
/D$@
/D$(
/l$@
/d$@v?H
/usr/share/rawtherapee
/usr/share/doc/rawtherapee
/themes/
/themes/slim
/options
/usr/share/color/icc
/cache
/languages/default
/languages/
/languages
/themes
/batch/queue.csv
/batch/
/dcpprofiles
/@q=
/N6rtexif16NAISOInterpreterE
于 2013-11-07T05:58:45.400 に答える