Python 实现通过后缀名查找关联的默认程序

技术 · 23 天前 · 61 人浏览

前言

假如有一个视频文件 video.mp4,需要在 Python 里面调用外部程序打开,你可能会直接使用 os.startfile() 方法,传入文件的路径,就能调用外部的播放器打开这个文件了,但是如果需要对播放器指定参数呢?这种方法就不适用了。

Windows

在 Windows 下,有一个 AssocQueryStringW 函数(参考文档),支持通过注册表查找关联的默认程序,这样就能直接获取到默认程序的路径,再加上自定义的参数就可以实现了,非常省事。

代码

import ctypes
from ctypes import wintypes

def query_association(file_ext):
    buffer = ctypes.create_unicode_buffer(512)
    pcchOut = wintypes.DWORD(512)
    
    result = ctypes.windll.shlwapi.AssocQueryStringW(0x00000000, 1, file_ext, None, buffer, ctypes.byref(pcchOut))
    
    if result == 0:
        return buffer.value
    else:
        return f"Error: {result}"

file_ext = ".mp4"
description = query_association(file_ext)
print(description)

这样运行后就直接输出 .mp4 文件所关联的默认程序的路径。
需要注意的是,如果打开音视频文件的默认应用是系统自带的 Windows 媒体播放器,这个函数就会报错。

pAIxdRU.png

Linux

而 Linux 下可通过 xgd-mime 查找默认启动软件,返回 .desktop 启动配置文件名称,使用 os.path.join 拼接得到完整的路径,再取出里面的 Exec 字段即可。

代码

desktop_file_name = subprocess.Popen("xdg-mime query default video/mp4", stdout = subprocess.PIPE, stderr = subprocess.STDOUT, shell = True, text = True)

desktop_file_path = os.path.join("/usr/share/applications", desktop_file_name.stdout.read().replace("\n", ""))

exec = subprocess.Popen(f"grep '^Exec=' {desktop_file_path} | head -n 1 | cut -d'=' -f2", stdout = subprocess.PIPE, stderr = subprocess.STDOUT, shell = True, text = True)

print(exec.stdout().replace("\n", ""))
Python
Theme Jasmine by Kent Liao