【问题标题】:Python: Opening a folder in Explorer/Nautilus/FinderPython:在 Explorer/Nautilus/Finder 中打开文件夹
【发布时间】:2011-10-01 15:47:13
【问题描述】:

我在 Python 中,我有某个文件夹的路径。我想使用该系统的默认文件夹资源管理器打开它。例如,如果是 Windows 计算机,我想使用 Explorer,如果是 Linux,我想使用 Nautilus 或任何默认设置,如果是 Mac,我想使用 Finder。

我该怎么做?

【问题讨论】:

标签: python cross-platform directory


【解决方案1】:

我很惊讶没有人提到将 xdg-open 用于 *nix,它适用于文件和文件夹:

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中打开文件夹时如何选择(高亮)文件?
  • @mahemadhi:这应该可行:subprocess.Popen(["explorer /select,", path])
  • @Cas:它不起作用。这样做:subprocess.Popen(["explorer", "/select,", path])
  • @Ronan:它不会打开文件夹,它只是选择它
  • @AbdullahSaid:如果您只想打开一个文件夹而不选择任何文件,请使用实际答案(os.startfile(path)
【解决方案2】:

您可以使用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) 代码将尝试在其默认应用程序中打开文件,而不是在似乎是 OP 想要的 Finder 窗口中打开文件。如另一个答案所述,您需要做一些不同的事情;见stackoverflow.com/questions/3520493/python-show-in-finder
  • @Ned:问题指出,“我有某个文件夹的路径”。然后,我假设文件路径不会传递给这个函数。同样的限制也适用于 Linux/Gnome 代码,它们也会在其默认应用程序中打开文件。
  • xdg-open 不是在 Linux 中打开给定文件的更通用方式吗?
  • 我会使用subprocess.Popen()而不是subprocess.check_call(),因为我们通常不想等待这些程序完成(并且Windows版本实际上会因为非零退出状态而出错) .
  • @RonanPaixão:在 OS X 和 Linux 上,进程将正确返回。您确定explorer 在以这种方式调用时不会在 Windows 上返回吗?它在终端上运行良好。
【解决方案3】:

以下适用于 Macintosh。

import webbrowser
webbrowser.open('file:///Users/test/test_folder')

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

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

正如另一个答案中所指出的,它也适用于 Windows。

【讨论】:

  • 我确认它可以在 Windows 上运行!如此简单又不错的解决方案!
  • 这应该是公认的解决方案。与问题所暗示的不同,webbrowser 在任何平台上以 nautilus、explorer、finder 或其他方式打开位置。
  • 在linux上也可以在前面加上“file://”,还是可以的。只需确保使用绝对路径和三个斜杠 (file:// /home/foo = file:///home/foo)。
  • 这在 ubuntu 上的普通 python shell 中工作,但在另一个应用程序中(比如在铸造厂的 Nuke 中)它默认为 firefox
【解决方案4】:

我认为您可能需要检测操作系统,然后相应地启动相关的文件资源管理器。

这可能对 OSX 的 Finder 有用:Python "show in finder"

(不幸的是,以下仅适用于 Windows)

import webbrowser as wb
wb.open('C:/path/to/folder')

这适用于 Windows。 我认为它可以在其他平台上运行。任何人都可以确认吗? 仅确认窗口 :(

【讨论】:

  • 不管 IE 是否是默认浏览器,这是否适用于 Windows?
  • 啊,你可能需要检测操作系统然后:(
  • 它给了我 OSError: [Errno 9] Bad file descriptor on Linux.
  • @cool-RR 在默认浏览器为 FF5 的 Windows 7 x64 上运行良好。
  • 它适用于我和 linux,其他人说它也适用于其他平台。只需以 webbrowser-y 方式编写即可:file://C:/lol 带有正斜杠。这同样适用于 linux:file:///home/foo/bar.
【解决方案5】:

解决此类问题的一种方法可能是优先考虑可读性,并以易于提取抽象的方式准备代码。您可以利用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 2012-09-02
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    相关资源
    最近更新 更多