"webbrowser" 模块如何工作?

How does "webbrowser" module work?

代码如下:

Sublime 插件:

文件 1:open_in_default_program.py:

# https://github.com/SublimeTextIssues/Core/issues/2368

import webbrowser
import sublime_plugin

class OpenInDefaultProgramCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        if self.view.file_name():
            webbrowser.open_new_tab("file://" + self.view.file_name())

    def is_visible(self):
        return self.view.file_name() is not None and (
            self.view.file_name()[-5:] == ".html" or
            self.view.file_name()[-3:] == ".md" or
            self.view.file_name()[-4:] == ".ahk")

文件 2:Context.sublime-菜单:

[
    { "command": "open_in_default_program" },
]

AutoHotkey 测试文件:

Test.ahk:

MsgBox Something

我的问题:

它适用于 HTML 和 Markdown 文件。它也适用于 AutoHotkey 文件——但是如何呢?据我所知,它使用浏览器。 AutoHotkey 文件无法在浏览器中打开 - 但实际上可以使用此插件完美启动它们。为什么有效?

这是另一个在默认应用程序中打开文件的插件,但它要复杂得多:https://github.com/SublimeText/OpenDefaultApplication/blob/master/OpenDefault.py

webbrowser.open 的文档中提到了这一点:

Note that on some platforms, trying to open a filename using this function, may work and start the operating system’s associated program. However, this is neither supported nor portable.

这是因为某些浏览器在给定一个它们不知道如何处理的文件时,会自动在该文件的默认程序中打开它。例如,在 Windows 上,Internet Explorer 基本上是与 Windows Explorer 相同的程序,1 所以要求 Internet Explorer 打开一个它不知道如何打开的文件处理与在 Windows 资源管理器中双击该文件的效果基本相同。

当然其他浏览器可能什么都不做,或者将文件复制到您的下载目录,或者弹出一个对话框询问您要对这个文件做什么。这就是为什么文档说 "this is neither supported nor portable".


还值得注意的是,与许多 stdlib 模块一样,webbrowser 的文档顶部有一个 link 到 the source code,并且源代码非常简单, 简单的 Python 代码。您最终会看到,它只是使用 subprocess 模块来调用类似的东西(取决于您检测到的浏览器,并且可能有一些特定于浏览器的选项来告诉它 "don't start a whole new browser, tell the existing browser window to open a new tab"):

iexplore.exe file://path/to/your/file

您可以很容易地弄清楚它 运行 正在执行什么命令,并在您的 shell/command 提示符下试验 运行 同一命令。


更复杂的插件显示了尽可能便携地执行此操作的方法:

  • 在 Windows,您可以调用 os.startfile
  • 在其他平台上,您 运行 一个命令行工具。 (该插件似乎在安装时找出正确的工具,将其存储在设置文件中,然后在该文件中查找。)
    • 在 macOS 上,它是 open
    • 在 FreeDesktop 系统上,包括大多数现代 Linux 发行版,它是 xdg-open

这三个选项通常足以覆盖 99% 的用户,几乎所有剩余的用户都知道自己在做什么,并且可以弄清楚要在您的设置文件中放入什么。 (当然,除非您正在为移动设备开发,在这种情况下您需要为 iOS 和 Android 编写特殊的处理程序。)


1.这在现代 Windows 中不再是真的,但它足以说明这一点。