“网络浏览器”模块如何工作?

时间:2018-07-29 21:28:14

标签: 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测试文件:

Test.ahk:

MsgBox Something

我的问题:

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

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

1 个答案:

答案 0 :(得分:4)

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

  

请注意,在某些平台上,尝试使用此功能打开文件名可能有效并启动操作系统的关联程序。但是,这既不受支持也不具有可移植性。

这样做的原因是,某些浏览器在给定一个不知道如何处理的文件时,将在该文件的默认程序中自动打开该文件。例如,在Windows上,Internet Explorer与Windows Explorer基本上是相同的程序, 1 ,因此要求Internet Explorer打开一个它不知道如何处理的文件与双击具有基本相同的效果。 Windows Explorer中的那个文件。

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


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

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

您可以轻松确定正在运行的命令,并尝试在Shell /命令提示符下运行同一命令。


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

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

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


1。在现代Windows中,这已经不再是真的了,但是它足够接近以说明问题所在。