2010-10-21 20 views
2

Je veux écrire l'équivalent python de mdfind. Je veux utiliser les métadonnées .Spotlight-V100 et je ne trouve pas de description pour le format de métadonnées db utilisé, mais NSMetadataQuery semble être ce dont j'ai besoin. Je voudrais le faire en python en utilisant les bindings Obj-C intégrés, mais je n'ai pas réussi à trouver l'incantation correcte pour que ça marche. Je ne sais pas si le problème est dû à la nature asynchrone de l'appel ou si je ne fais que raccorder les choses de manière incorrecte.Comment puis-je écrire un script python équivalent à mdfind en utilisant les liaisons PyObjC et NSMetadataQuery?

Un exemple simple donnant l'équivalent de "mdfind" serait bien pour un démarrage.

Répondre

1

J'ai une version très simple qui fonctionne. Je n'ai pas tout à fait correct le prédicat, comme l'appel mdfind a des résultats supplémentaires. En outre, il nécessite deux arguments, le premier est le nom de chemin de base à partir de travailler avec le second étant le terme de recherche.

Voici le code:

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") 

L'appel de requête est asynchrone, pour être plus complet, j'enregistrer un rappel, la boucle de course aller en continu. Comme c'est le cas, je fais une recherche de 5 secondes, donc si nous avons une requête qui prendrait plus de temps, nous n'obtiendrons que des résultats partiels.

+0

Avez-vous déjà implémenté une version de rappel Tim? –