在Python中有没有跨平台的方法打开文件浏览器?

16 投票
4 回答
8774 浏览
提问于 2025-04-15 16:22

我在想,能不能做一个类似于webbrowser模块的东西,不过是用来打开文件浏览器的。在Windows上,我想打开资源管理器;在Linux的GNOME环境下,我想打开nautilus;在KDE环境下,我想打开Konqueror等等。如果能避免一些麻烦的做法就更好了。;-)

4 个回答

-1

这只是个随便的建议,但你可以看看wxPython,它是一个可以让你用Python来操作底层wxWidgets库的工具。虽然我很久没关注过它了,但里面可能有你能用的东西。如果不行的话,自己做一个文件浏览器也应该比较简单,这样可以使用每个操作系统的原生“控件”。

不过要注意,wxPython并不轻量,它会让你的应用变得比较庞大,还会增加一些依赖。

1

我刚看到一个帖子,里面有类似的问题,链接是在Python中使用简单对话框选择文件。我建议你去看看,里面有很多示例和代码片段。基本上,提供了两个建议:

  1. 使用tkinter:这个库在macOS和Windows上都能用,而且非常流行,所以网上有很多相关的资料。
  2. 使用plyer:这个库看起来比较新,不同操作系统的支持程度差别挺大。

我建议先试试tkinter,如果不行再考虑其他选项。

因为这个讨论已经很久了,可能值得分享一些最近出现的新选择,帮助其他人找到同样问题的答案。

23

如果可以的话,我不想搞得太复杂。

嗯,我觉得你可能需要一些简单的检测平台的代码,但希望不需要像那个可怕的命令检测的 webbrowser 模块那么麻烦。这是我初步的尝试:

if sys.platform=='win32':
    subprocess.Popen(['start', d], shell= True)

elif sys.platform=='darwin':
    subprocess.Popen(['open', d])

else:
    try:
        subprocess.Popen(['xdg-open', d])
    except OSError:
        # er, think of something else to try
        # xdg-open *should* be supported by recent Gnome, KDE, Xfce

注意,win32版本目前在文件名中有空格时会出错。Bug 2304 可能和这个有关,但似乎在Windows的命令行(cmd /c ...)中,参数转义有个基本问题,就是你不能嵌套双引号,也不能用 ^ 来转义引号或空格。我完全没找到任何方法可以在命令行中引用并运行 cmd /c start C:\Documents and Settings

关于 nosklo 的评论补充:在Windows上,有一种内置的方法可以做到这一点:

if sys.platform=='win32':
    os.startfile(d)

这是一个不太好的替代方案,用来找到命令行并用它打开一个文件夹,你现在可能不需要这个,但我还是留着。部分原因是它可能对其他事情有用,但主要是因为我花时间把这个写出来了!

if sys.platform=='win32':
    import _winreg
    path= r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon')
    for root in (_winreg.HKEY_CURRENT_USER, _winreg.HKEY_LOCAL_MACHINE):
        try:
            with _winreg.OpenKey(root, path) as k:
                value, regtype= _winreg.QueryValueEx(k, 'Shell')
        except WindowsError:
            pass
        else:
            if regtype in (_winreg.REG_SZ, _winreg.REG_EXPAND_SZ):
                shell= value
            break
    else:
        shell= 'Explorer.exe'
    subprocess.Popen([shell, d])

撰写回答