Python 打开文件夹或用默认程序打开文件:跨平台方法
用 Python 打开资源管理器定位文件夹、用系统默认程序打开文件、打开网址,跨 Windows/Mac/Linux 三种方案,附完整代码和注意事项。
场景痛点
脚本跑完生成了一堆报告文件,你还要手动去资源管理器里一层层点过去找。希望脚本执行完自动弹出输出目录,或者直接用系统默认看图软件打开刚生成的图片,或者用默认浏览器打开生成的 HTML 报告。跨平台脚本还要兼容 Windows、Mac、Linux,不能每台机器换一次写法。
用到的库
# 全部标准库,不需要 pip 安装
# os, subprocess, sys, webbrowser
完整代码
import os
import sys
import subprocess
import webbrowser
def open_in_file_manager(path):
"""在系统文件管理器里打开并定位到 path(文件或文件夹)"""
path = os.path.abspath(path)
if sys.platform.startswith("win"):
# Windows: /select, 会在资源管理器里选中这个文件
subprocess.Popen(["explorer", "/select,", path])
elif sys.platform == "darwin":
# Mac: -R 在 Finder 里高亮文件
subprocess.Popen(["open", "-R", path])
else:
# Linux: 直接打开所在目录
folder = path if os.path.isdir(path) else os.path.dirname(path)
subprocess.Popen(["xdg-open", folder])
print(f"已打开:{path}")
def open_with_default_app(path):
"""用系统默认程序打开文件(图片用看图软件、PDF 用阅读器)"""
path = os.path.abspath(path)
if sys.platform.startswith("win"):
os.startfile(path)
elif sys.platform == "darwin":
subprocess.Popen(["open", path])
else:
subprocess.Popen(["xdg-open", path])
print(f"已用默认程序打开:{path}")
def open_url(url):
"""用默认浏览器打开网址,跨平台最稳的方式"""
webbrowser.open(url)
print(f"已在浏览器打开:{url}")
def main():
# 1. 打开当前脚本所在目录
open_in_file_manager(".")
# 2. 用默认看图软件打开一张图
# open_with_default_app("./photos/test.jpg")
# 3. 用默认浏览器打开网址
open_url("https://www.baidu.com")
if __name__ == "__main__":
main()
代码讲解
sys.platform判断当前操作系统:win32是 Windows,darwin是 Mac,linux是 Linux,用一个函数分发三种命令。- Windows 的
explorer /select,路径能在资源管理器里打开并选中文件,比单纯打开目录体验好。 os.startfile是 Windows 独有的,调用系统 Shell 用关联程序打开文件,一行搞定;Mac/Linux 没有这个函数,分别用open和xdg-open。webbrowser.open(url)是 Python 标准库,自动选系统默认浏览器,跨平台最稳,做自动化报告时直接弹浏览器。subprocess.Popen不等待子进程结束,脚本继续往下跑,不会卡在打开文件上。
运行结果
运行后会在系统文件管理器里打开当前目录;如果取消注释第二行,会用默认看图软件打开指定图片;最后用默认浏览器打开百度首页。脚本本身不阻塞,打开后立刻结束。
注意事项
os.startfile只在 Windows 存在,跨平台脚本一定要用sys.platform判断,别直接调。- Linux 服务器没有图形界面,
xdg-open会报错,这个功能只适合桌面环境。 - WSL 里跑
xdg-open不能直接弹 Windows 资源管理器,需要单独配置 WSLg。 webbrowser.open在 Linux 服务器上如果没装浏览器会失败,自动化部署脚本别依赖这个。- 路径带中文在 Windows 下没问题,但传给 subprocess 时建议用 list 形式,不要拼字符串,避免空格路径被拆错。

更新时间:2026-09-14 20:36:42