Как работает модуль «веб-браузер»?

1

Вот код:

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

  • 0
    Примечание: 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 возможных окончаний и возвращает True если какой-либо из них завершает строку, и избегает хрупких вещей, таких как нарезка жестко закодированными индексами).
  • 0
    @ShadowRanger ShadowRanger Как я понимаю, эта компактная форма не будет работать в ST? (У меня не работает, по крайней мере).
Показать ещё 4 комментария
Теги:
sublimetext3
sublimetext
python-webbrowser

1 ответ

4
Лучший ответ

Это указано в документации для webbrowser.open:

Обратите внимание, что на некоторых платформах, пытаясь открыть имя файла, используя эту функцию, может работать и запускать связанную с операционной системой программу. Однако это не поддерживается и не переносится.

Причина этого заключается в том, что некоторые браузеры, когда им задан файл, который они не знают, как обрабатывать, автоматически откроют его в программе по умолчанию для этого файла. Например, в Windows, Internet Explorer, в основном та же программа, как в Проводнике Windows, 1 поэтому просят Internet Explorer, чтобы открыть файл, он не знает, как обращаться имеет в основном тот же эффект, дважды щелкнув файл в проводнике Windows.

Конечно, другие браузеры ничего не могут сделать или скопировать файл в каталог "Загрузки" или открыть диалоговое окно с запросом на то, что вы хотите сделать с этим файлом. Вот почему документы говорят, что "это не поддерживается и не переносится".


Также стоит отметить, что, как и многие модули stdlib, документы для webbrowser имеют ссылку на исходный код наверху, а исходный код - довольно простой, простой код Python. Вы можете видеть, что в конечном счете, просто используя модуль subprocess чтобы вызвать что-то вроде (в зависимости от вашего обнаруженного браузера и, возможно, с некоторыми конкретными опциями браузера, чтобы сказать это ", не запускайте совершенно новый браузер, сообщите текущему окну браузера открыть новую вкладку "):

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

Вы можете легко определить, в какой команде он работает, и экспериментировать с той же командой в командной строке.


Более сложный плагин показывает способ сделать это как можно более мобильно:

  • В Windows вы можете вызвать os.startfile.
  • На других платформах вы запускаете инструмент командной строки. (Плагин, кажется, разрабатывает правильный инструмент во время установки, сохраняет его в файле настроек и ищет его в этом файле.)
    • На macOS он open.
    • В системах FreeDesktop, включая большинство современных дистрибутивов Linux, это xdg-open.

Эти три варианта обычно достаточно, чтобы охватить 99% ваших пользователей, и почти все остальные пользователи будут людьми, которые знают, что они делают, и могут выяснить, что добавить в ваш файл настроек. (Если, конечно, вы не разрабатываете для мобильных устройств, в этом случае вы захотите написать специальные обработчики для iOS и Android.)


1. В современных Windows это уже не так, но это достаточно близко, чтобы проиллюстрировать суть.

  • 0
    Просто для записи: мой браузер по умолчанию - Chrome, в Windows 7.
  • 0
    @jsv Спасибо; исправлено.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню