in Linux, existe-t-il un moyen de demander à tous les services XDG ou à des services GTK, quelle application est l'application par défaut pour un fichier donné?
Je réalise que xdg-ouvert strong> sera en fait , lancez la bonne application. Cependant, je souhaite pouvoir afficher le nom de l'application dans un menu contextuel. Ainsi, lorsque l'utilisateur clique sur l'élément de menu, il lancera ensuite XDG-Open, qui lancera cette application. P> sur OSX, je peux utiliser des services de lancement pour cela: P> def getDefaultDarwinApplication(path):
import LaunchServices
import CoreData
import urllib
url = CoreData.CFURLRef.URLWithString_("file://"+urllib.quote(path))
os_status, app_ref, appurl = LaunchServices.LSGetApplicationForURL(url, LaunchServices.kLSRolesAll, None, None)
if os_status != 0:
return ""
apppath = app_ref.as_pathname()
name = os.path.basename(apppath).replace(".app", "")
return name
3 Réponses :
Utilisez la commande Notez que cela renvoie le nom du fichier associé Voici le code complet : p> Exemple d'utilisation: p> xdg-mime code>. Il vous permet d'interroger pour un mimeType, puis d'obtenir le programme associé, sans l'exécuter. .desktop code>. Ensuite, vous devez localiser le fichier réel et analysez-le pour obtenir le nom réel du programme, même localisé dans n'importe quelle langue que vous souhaitez, chemin du binaire sur le disque, etc. P> p = get_defaults('index.html')
print p['name'], p['comment']
Cela ne localisera pas correctement les fichiers par utilisateur .desktop code> (tels que ceux créés pour les associations personnalisées) comme ceux qui vivent dans $ xdg_data_home code> ou ~ / .local / Share / code> si le premier est non défini. Vous devez regarder dans ce répertoire avant d'aller à ceux nommés dans $ xdg_data_dirs code>. Ceci est indiqué dans la spécification XDG Base Dir. Althoublement pas aussi clairement que je voudrais.
De plus, vous devez également numériser tous les sous-répertoires de $ xdg_data_dirs / applications code> pour rechercher des fichiers de bureau avec des préfixes de fournisseur (comme indiqué par la spécification du menu XDG, la section fusionne).
@Dan D.: Merci pour votre commentaire, j'ai modifié le code ci-dessus pour suivre cette spécification.
@lunaryn: bonne prise, je numérise maintenant des sous-répertoires.
J'ai également trouvé du code dans Python-XDG pour vous aider avec une partie de cela. De XDG Importation basé sur OBJ = BaseyRectory.load_Data_Paths ("Applications", Desktop_Filename) Cela se débarrassera de la méthode _get_app_Paths () pour nous.
Voici une version légèrement plus compacte en utilisant certaines méthodes du module officiel de Python XDG et en utilisant une partie du code arrière de @nosklo: et un exemple de comment l'utiliser: < / p>