Python: 在Explorer/Nautilus/Finder中打开文件夹

45

我使用Python,有一个特定文件夹的路径,想要通过系统默认的文件夹浏览器打开它。例如,在Windows电脑上,我希望使用Explorer,在Linux上,我希望使用Nautilus或者默认的浏览器,在Mac上,我希望使用Finder。

我应该怎么做呢?


似乎是 https://dev59.com/knA75IYBdhLWcg3wAUF9 的2/3重复。 - Ned Deily
6个回答

54

我很惊讶没有人提到在*nix中使用xdg-open,它可以用于文件和文件夹:

import os
import platform
import subprocess

def open_file(path):
    if platform.system() == "Windows":
        os.startfile(path)
    elif platform.system() == "Darwin":
        subprocess.Popen(["open", path])
    else:
        subprocess.Popen(["xdg-open", path])

在Windows中打开文件夹时如何选择(突出显示)一个文件? - Mahendran
2
@mahemadhi:这个应该可以用:subprocess.Popen(["explorer /select,", path]) - Cas
6
@Cas: 它不起作用。这个可以:subprocess.Popen(["explorer", "/select,", path]) - Ronan Paixão
@Ronan:它不会打开文件夹,只是选择它。 - greendino
1
@AbdullahSaid:如果你只想打开一个文件夹而不选择任何文件,请使用实际答案(os.startfile(path))。 - Ronan Paixão

22

你可以使用subprocess

import subprocess
import sys

if sys.platform == 'darwin':
    def openFolder(path):
        subprocess.check_call(['open', '--', path])
elif sys.platform == 'linux2':
    def openFolder(path):
        subprocess.check_call(['xdg-open', '--', path])
elif sys.platform == 'win32':
    def openFolder(path):
        subprocess.check_call(['explorer', path])

OS X(darwin)代码将尝试在其默认应用程序中打开文件,而不是在Finder窗口中打开,这似乎是OP想要的。正如另一个答案中所指出的那样,您需要做一些不同的事情;请参见https://dev59.com/knA75IYBdhLWcg3wAUF9。 - Ned Deily
@Ned:问题陈述为“我有某个文件夹的路径”。因此,我认为文件路径不会传递到该函数中。同样的限制也适用于Linux/Gnome代码,它也会在默认应用程序中打开文件。 - Dietrich Epp
“xdg-open” 不是在 Linux 中打开特定文件的更普遍的方法吗? - NoBugs
2
我会使用subprocess.Popen()而不是subprocess.check_call(),因为我们通常不想等待这些程序完成(而且Windows版本实际上会因为非零退出状态而出错)。 - Ronan Paixão
@RonanPaixão:在OS X和Linux上,进程将正确返回。您确定在Windows上以这种方式调用时“explorer”不会返回吗?从终端运行它很好用。 - Dietrich Epp

16
下面这个在Macintosh上有效。
import webbrowser
webbrowser.open('file:///Users/test/test_folder')

在GNU / Linux上,请使用文件夹的绝对路径。(确保该文件夹存在)

import webbrowser
webbrowser.open('/home/test/test_folder')

正如其他答案所指出的,它在 Windows 上也可以工作。


我确认它在Windows上可以运行!如此简单而美妙的解决方案! - otterb
这应该是被接受的解决方案。与问题所暗示的不同,webbrowser 在任何平台上都可以在 Nautilus、Explorer、Finder 或其他地方打开位置。 - Nearoo
1
你也可以在Linux前面加上“file://”,它仍然可以工作。只需确保您使用绝对路径和三个斜杠(file:///home/foo = file:///home/foo)。 - Nearoo
2
这在Ubuntu上的普通Python shell中可以工作,但在另一个应用程序(比如Foundry的Nuke)中默认为Firefox。 - tk421storm

3
我认为你需要检测操作系统,然后相应地启动文件浏览器。 这对于OSX的Finder非常有用:Python“在Finder中显示”。(很遗憾下面的内容仅适用于Windows)
import webbrowser as wb
wb.open('C:/path/to/folder')

这适用于Windows系统。我认为它可以在其他平台上运行。有人可以确认一下吗?只适用于Windows系统 :(


无论是否将IE设置为默认浏览器,这在Windows上能否工作? - Ram Rachum
啊,你可能需要检测操作系统 :( - Acorn
在Linux上出现了OSError:[Errno 9]坏文件描述符。 - utdemir
@cool-RR 在 Windows 7 x64 上使用默认浏览器 FF5 运行良好。 - Voo
它在我的Linux系统上可以工作,在其他平台上也有人说可以。只需在Web浏览器中键入file://C:/lol(使用正斜杠)。 在Linux中同样适用:file:///home/foo/bar - Nearoo

2

对于Mac OS,您可以使用

import subprocess
subprocess.run["open", "your/path"])

那真的很难吗?=)谢谢!您的示例中有错别字:缺少打开括号“(”来调用subprocess.run。 - horace

1
一种解决这类问题的方法可能是优先考虑可读性,并以易于提取抽象为准备代码的方式。您可以利用Python的高阶函数功能,按照这些方式进行操作,在特定平台不受支持时,如果无法进行正确的函数分配,则可以引发异常。
import subprocess
import sys


class UnsupportedPlatformException(Exception):
    pass


def _show_file_darwin():
    subprocess.check_call(["open", "--", path])

def _show_file_linux():
    subprocess.check_call(["xdg-open", "--", path])

def _show_file_win32():
    subprocess.check_call(["explorer", "/select", path])

_show_file_func = {'darwin': _show_file_darwin, 
                   'linux': _show_file_linux,
                   'win32': _show_file_win32}

try:
    show_file = _show_file_func[sys.platform]
except KeyError:
    raise UnsupportedPlatformException


# then call show_file() as usual

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