【问题标题】:How does "webbrowser" module work?“网络浏览器”模块如何工作?
【发布时间】:2018-07-29 21:28:13
【问题描述】:

代码如下:

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

【问题讨论】:

  • 旁注:self.view.file_name()[-5:] == ".html" or self.view.file_name()[-3:] == ".md" or self.view.file_name()[-4:] == ".ahk" 是一种非常冗长/脆弱(由于硬编码切片索引)拼写self.view.file_name.endswith((".html", ".md", ".ahk")) 的方式(endswith 接受tuple 的可能结尾并返回@ 987654331@ 如果它们中的任何一个终止字符串,它可以避免像硬编码索引切片这样的脆弱的东西。
  • @ShadowRanger 据我了解,这种紧凑的形式在 ST 中不起作用? (至少对我不起作用)。
  • SublimeText 是纯 Python,对吧? endswithis a plain Python method on str;应该在任何地方都可以工作。
  • @ShadowRanger 是的,确实可以,但是必须在file_name之后加上()
  • 另外,我发现,在.file_name() 之后添加.lower() 是个好主意。因此,代码也适用于大写扩展。

标签: python sublimetext3 sublimetext python-webbrowser


【解决方案1】:

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

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

原因是某些浏览器在给定一个他们不知道如何处理的文件时,会自动在该文件的默认程序中打开它。比如在 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 上,它是 open
    • 在 FreeDesktop 系统上,包括大多数现代 Linux 发行版,它是 xdg-open

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


1。这在现代 Windows 中不再是真的了,但它已经足够说明这一点了。

【讨论】:

  • 仅作记录:我的默认浏览器是 Chrome,在 Windows 7 上。
  • @jsv 谢谢;固定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
相关资源
最近更新 更多