【发布时间】:2011-10-01 15:47:13
【问题描述】:
我在 Python 中,我有某个文件夹的路径。我想使用该系统的默认文件夹资源管理器打开它。例如,如果是 Windows 计算机,我想使用 Explorer,如果是 Linux,我想使用 Nautilus 或任何默认设置,如果是 Mac,我想使用 Finder。
我该怎么做?
【问题讨论】:
标签: python cross-platform directory
我在 Python 中,我有某个文件夹的路径。我想使用该系统的默认文件夹资源管理器打开它。例如,如果是 Windows 计算机,我想使用 Explorer,如果是 Linux,我想使用 Nautilus 或任何默认设置,如果是 Mac,我想使用 Finder。
我该怎么做?
【问题讨论】:
标签: python cross-platform directory
我很惊讶没有人提到将 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])
【讨论】:
subprocess.Popen(["explorer /select,", path])
subprocess.Popen(["explorer", "/select,", path])
os.startfile(path))
您可以使用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])
【讨论】:
darwin) 代码将尝试在其默认应用程序中打开文件,而不是在似乎是 OP 想要的 Finder 窗口中打开文件。如另一个答案所述,您需要做一些不同的事情;见stackoverflow.com/questions/3520493/python-show-in-finder。
xdg-open 不是在 Linux 中打开给定文件的更通用方式吗?
subprocess.Popen()而不是subprocess.check_call(),因为我们通常不想等待这些程序完成(并且Windows版本实际上会因为非零退出状态而出错) .
explorer 在以这种方式调用时不会在 Windows 上返回吗?它在终端上运行良好。
以下适用于 Macintosh。
import webbrowser
webbrowser.open('file:///Users/test/test_folder')
在 GNU/Linux 上,使用文件夹的绝对路径。 (确保文件夹存在)
import webbrowser
webbrowser.open('/home/test/test_folder')
正如另一个答案中所指出的,它也适用于 Windows。
【讨论】:
webbrowser 在任何平台上以 nautilus、explorer、finder 或其他方式打开位置。
file:// /home/foo = file:///home/foo)。
我认为您可能需要检测操作系统,然后相应地启动相关的文件资源管理器。
这可能对 OSX 的 Finder 有用:Python "show in finder"
(不幸的是,以下仅适用于 Windows)
import webbrowser as wb
wb.open('C:/path/to/folder')
这适用于 Windows。 我认为它可以在其他平台上运行。任何人都可以确认吗? 仅确认窗口 :(
【讨论】:
file://C:/lol 带有正斜杠。这同样适用于 linux:file:///home/foo/bar.
解决此类问题的一种方法可能是优先考虑可读性,并以易于提取抽象的方式准备代码。您可以利用 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
【讨论】: