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

16

我在考虑类似于webbrowser模块的功能,但是针对文件浏览器。在Windows中,我想要打开资源管理器,在Linux的GNOME下,我想要打开nautilus,在KDE下则是Konqueror等等。如果可能的话,我希望不要使用临时解决方案。


由于“文件浏览器”不是一个跨平台的功能,你具体指的是什么?你是在说一种“跨平台”的GUI窗口吗?你已经研究过哪些符合你对“跨平台”的定义的GUI工具包了呢? - S.Lott
1
@S.Lott:不是Python进程拥有的GUI窗口——以与webbrowser相同的方式向本地子进程外壳,适合用户的操作环境。 - cdleary
4个回答

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 shell (cmd /c ...)存在基本问题,即您无法嵌套双引号,也无法^-转义引号或空格。我尚未找到任何方法可以在命令行中引用并运行cmd /c start C:\Documents and Settings
有关nosklo评论的ETA:仅限Windows,有一种内置方法可以实现:
if sys.platform=='win32':
    os.startfile(d)

以下是寻找shell并打开文件夹的不太好的替代解决方案,你现在应该不需要它,但我会保留它。 (部分原因是它可能对其他事情有用,但主要是因为我花了时间打这个该死的东西!)

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])

1
希望全球支持这个功能,参见http://bugs.python.org/issue3177。 - bobince
1
在Windows 7中,os.startfile和冗长的注册表/subprocess方法仍然对我有效。 - bobince

1

我刚看到了一个类似问题的帖子Choosing a file in Python with simple Dialog。我建议去那里查看示例和代码片段。基本上有两个建议:

  1. 使用tkinter:它与macOS和Windows兼容,而且非常流行,因此有很多关于它的资料。
  2. 使用plyer:看起来是一个比较新的库,不同操作系统中支持程度差别较大。

我会先尝试tkinter,如果失败再尝试其中一种替代方案。

由于这个帖子非常老,值得分享一些可能更近期出现的新替代方案,供其他人寻找答案时参考。


-1
这只是一个猜测,但可以看一下wxPython,它提供了Python绑定到底层wxWidgets库的功能。我很久以前就看过它了,但可能有你可以使用的东西。否则,应该相对容易制作自己的文件浏览器,将使用每个操作系统的本地“小部件”。
请注意,wxPython不是轻量级的,它会真正增加您的应用程序体积并增加依赖项。

-2

我不知道是否存在一个现成的模块,但如果有的话,应该在Activestate的Python Cookbok上(http://code.activestate.com/recipes/langs/python/)。

此外,在gnome和mac os上,您可以执行“gnome-open http://blah”和“open http://blah”(在mac上);两者都将在用户首选浏览器中打开URL。

对于Linux,还应检查freedesktop.org--一组通用工具,涵盖Gnome和KDE,应该包括类似的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接