Используйте команду xdg-mime
.Это позволяет вам запрашивать mimetype, а затем связывать программу, не выполняя ее.
Обратите внимание, что при этом возвращается имя связанного файла .desktop
.Затем вам нужно найти фактический файл и затем проанализировать его, чтобы получить реальное имя программы, даже локализованное на любом языке, который вы хотите, путь двоичного файла на диске и т. Д.
Вот полный код:
import os
import subprocess
import codecs
import ConfigParser
class XDGError(Exception): pass
class FileNotFoundError(Exception): pass
def _get_app_paths():
paths = os.environ.get('XDG_DATA_HOME',
os.path.expanduser('~/.local/share/')).split(os.path.pathsep)
paths.extend(os.environ.get('XDG_DATA_DIRS',
'/usr/local/share/:/usr/share/').split(os.path.pathsep))
return paths
def xdg_query(command, parameter):
p = subprocess.Popen(['xdg-mime', 'query', command, parameter],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, errors = p.communicate()
if p.returncode or errors:
raise XDGError('xdg-mime returned error code %d: %s' %
(p.returncode, errors.strip()))
return output.strip()
def locate_desktop_file(filename, mode='r', encoding='utf-8',
_paths=_get_app_paths()):
for path in _paths:
for thispath, dirs, files in os.walk(os.path.join(path, 'applications')):
if filename not in files:
continue
fullname = os.path.join(thispath, filename)
try:
return codecs.open(fullname, mode, encoding)
except IOError:
pass
else:
raise FileNotFoundError(filename)
def get_defaults(filename):
filetype = xdg_query('filetype', filename)
desktop_filename = xdg_query('default', filetype)
with locate_desktop_file(desktop_filename) as desktop_file:
parser = ConfigParser.ConfigParser()
parser.readfp(desktop_file, desktop_filename)
return dict(parser.items(parser.sections()[0]))
Пример использования:
p = get_defaults('index.html')
print p['name'], p['comment']