7
votes

Trouvez le nom de l'application par défaut pour un fichier donné

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


0 commentaires

3 Réponses :


8
votes

Utilisez la commande xdg-mime code>. Il vous permet d'interroger pour un mimeType, puis d'obtenir le programme associé, sans l'exécuter.

Notez que cela renvoie le nom du fichier associé .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>

Voici le code complet : p> xxx pré>

Exemple d'utilisation: p>

p = get_defaults('index.html')
print p['name'], p['comment']


5 commentaires

Cela ne localisera pas correctement les fichiers par utilisateur .desktop (tels que ceux créés pour les associations personnalisées) comme ceux qui vivent dans $ xdg_data_home ou ~ / .local / Share / si le premier est non défini. Vous devez regarder dans ce répertoire avant d'aller à ceux nommés dans $ xdg_data_dirs . 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 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.



1
votes

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: xxx

et un exemple de comment l'utiliser: < / p> xxx


0 commentaires

4
votes

Mieux encore mieux j'ai trouvé La voie officielle Gnome pour le faire. xxx


0 commentaires