前言
假如有一个视频文件 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 媒体播放器,这个函数就会报错。
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", ""))