Как я могу написать сценарий Python, эквивалентный mdfind, используя привязки PyObjC и NSMetadataQuery? - PullRequest
2 голосов
/ 22 октября 2010

Я хочу написать эквивалент Python для mdfind.Я хочу использовать метаданные .Spotlight-V100 и не могу найти описание используемого формата метаданных в БД, но мне кажется, что мне нужен NSMetadataQuery.Я хотел бы сделать это в Python, используя встроенные привязки Obj-C, но не смог выяснить правильное заклинание, чтобы заставить его работать.Не уверен, что проблема в асинхронном характере вызова, или я просто неправильно соединяю вещи.

Простой пример, дающий эквивалент «mdfind», подойдет для начала.

1 Ответ

1 голос
/ 22 октября 2010

У меня работает очень простая версия.У меня не совсем правильный предикат, так как эквивалентный вызов mdfind имеет дополнительные результаты.Кроме того, требуется два аргумента: первое - это базовый путь для работы, второе - поисковый запрос.

Вот код:

from Cocoa import *

import sys

query = NSMetadataQuery.alloc().init()
query.setPredicate_(NSPredicate.predicateWithFormat_("(kMDItemTextContent = \"" + sys.argv[2] + "\")"))
query.setSearchScopes_(NSArray.arrayWithObject_(sys.argv[1]))
query.startQuery()
NSRunLoop.currentRunLoop().runUntilDate_(NSDate.dateWithTimeIntervalSinceNow_(5))
query.stopQuery()
print "count: ", len(query.results())
for item in query.results():
    print "item: ", item.valueForAttribute_("kMDItemPath")

Вызов запроса асинхронный,поэтому, чтобы быть более полным, я должен зарегистрировать обратный вызов и сделать цикл выполнения непрерывным.Сейчас я выполняю поиск в течение 5 секунд, поэтому, если у нас будет запрос, который займет больше времени, мы получим только частичные результаты.

...