python - "webbrowser"模块是如何工作的?

标签 python sublimetext3 sublimetext python-webbrowser

代码如下:

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-menu:

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

AutoHotkey测试文件:

测试.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 资源管理器中的那个文件。

当然其他浏览器可能什么也不做,或者将文件复制到您的下载目录,或者弹出一个对话框询问您要对这个文件做什么。这就是为什么文档说“这既不支持也不便携”。


同样值得注意的是,与许多 stdlib 模块一样,webbrowser 的文档有一个指向 the source code 的链接。在顶部,源代码非常简单,是简单的 Python 代码。你可以看到最终,它只是使用 subprocess 模块来调用类似的东西(取决于你检测到的浏览器,并且可能有一些特定于浏览器的选项来告诉它“不要启动一个全新的浏览器, 告诉现有的浏览器窗口打开一个新标签页"):

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

您可以轻松地准确计算出它正在运行的命令,并在您的 shell/命令提示符下尝试运行相同的命令。


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

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

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


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

关于python - "webbrowser"模块是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51584708/

相关文章:

Python Pandas 读取带有特定行终止符的 CSV 文件

sublimetext3 - 如何在崇高的文本中显示幻影?

sublimetext - 如何在 Sublime Text 3 中对齐文本?

用于将文件路径转换为包/命名空间的正则表达式

sublimetext2 - 在 Sublime 文本中同时粘贴和剪切选择的快捷方式?

colors - Sublime Text 中的白色文本

python - 无法使用 PyMySQL 与远程 MySQL 服务器建立 TLS TCP 连接,其他工具可以工作

python - 如何从 Django 表单获取 ChoiceField 值?

python - 通过 Pandas DataFrame 循环切片字符串

python - Sublime Text 中反斜杠前的红灯