Как я могу написать скрипты Nautilus на Python?

Я хочу написать скрипт наутилуса на Python. Это возможно? Если это возможно, как я могу это сделать?

2 ответа

Решение

Сценарии Наутилуса

Скрипты Nautilus могут быть написаны на любом языке программирования, включая Python. Вам просто нужно сделать исполняемый файл исходного кода Python и скопировать его в ~/.gnome2/nautilus-scripts в версиях Ubuntu до 14.04. Для Ubuntu 14.04 и новее каталог отличается: ~/.local/share/nautilus/scripts

Вам также нужно будет добавить #!/usr/bin/env python в первой строке файла. Обратите внимание, что по умолчанию #!/usr/bin/env python указывает на Python2. Если вам нужен Python 3 специально, используйте #!/usr/bin/env python3,

Как только вы все это сделаете, скрипт будет доступен из scripts подменю меню правой кнопки мыши в Nautilus.

меню скриптов наутилуса

Смотрите также: https://help.ubuntu.com/community/NautilusScriptsHowto

Наутилус Расширения

Расширения Nautilus обладают большей гибкостью, чем сценарии - например. их можно использовать для добавления элемента непосредственно в контекстное меню. Доступны привязки python ( python-nautilus).

Посетите веб-страницу этой библиотеки и просмотрите документацию для получения дополнительной информации.

Вот шаблон скрипта и шаблон расширения.

Чтобы перезапустить Nautilus и перезагрузить код, выполните nautilus -q && nautilus ~.

Скрипты

Это зарегистрирует переменные среды , которые Nautilus устанавливает для сценариев.~/script.log. Он также будет регистрировать возможные ошибки (без синтаксических ошибок).

myscript.py

      #!/usr/bin/python3

import os, logging

logpath = os.path.expanduser('~/script.log')

logging.basicConfig(
    filename=logpath,
    encoding='utf-8',
    level=logging.DEBUG,
    format='%(message)s',
)

def logenv(env):
    logging.debug(os.environ[env].strip())

try:
    logenv('NAUTILUS_SCRIPT_SELECTED_FILE_PATHS')
    logenv('NAUTILUS_SCRIPT_SELECTED_URIS')
    logenv('NAUTILUS_SCRIPT_CURRENT_URI')
    #~ logenv('NAUTILUS_SCRIPT_WINDOW_GEOMETRY')  # seems to be not supported any more.
except:
    from traceback import format_exc as exception_as_string
    logging.debug(exception_as_string())

Поместите скрипт в~/.local/share/nautilus/scripts. Сделайте его исполняемым. Перезапустите Наутилус (см. выше). Выберите несколько файлов или папок в Nautilus и щелкните правой кнопкой мыши. Сценарий появится в пункте меню «Сценарии».

Расширения

Расширения немного сложнее, но с ними можно делать больше, например, возможны цепочки меню.

Сначала установите с помощью менеджера пакетов.

  • Федора:sudo dnf install nautilus-python<- подтверждаю, работает
  • Дебиан:sudo apt install nautilus-python
  • Арка:sudo pacman -Sy python-nautilus

Источник

Каждое расширение должно создать класс, который расширяетGObject.GObjectиNautilus.MenuProvider.

myextension.py

      #!/usr/bin/python3

import os, logging

logpath = '~/extension.log'

logging.basicConfig(
    filename=os.path.expanduser(logpath),
    encoding='utf-8',
    level=logging.DEBUG,
    format='%(message)s',
)

d = logging.debug

try:

    from gi.repository import Nautilus, GObject

    class MyInspectExtension(GObject.GObject, Nautilus.MenuProvider):

        def __init__(self):
            super().__init__()
            d("extension initialized")

        # Hmm. This gets constantly called.
        def get_file_items(self, entries):
            d("---\nInspect selected entries")
            if len(entries) < 1:
                d("nothing selected")
                return []
            item = Nautilus.MenuItem(
                name="MyInspectExtension::inspect_selected_entries",
                label="Inspect selected entries",
                tip=f"Write infos about the `entries` parameter to {logpath}",
            )
            item.connect("activate", inspect, entries)
            return [item]

        # Dito.
        def get_background_items(self, folder):
            logging.debug("---\nInspect current folder")
            item = Nautilus.MenuItem(
                name="MyInspectExtension::inspect_current_folder",
                label="Inspect current folder",
                tip=f"write infos about the `folder` parameter to {logpath}",
            )
            item.connect("activate", inspect, [folder])
            return [item]

    def inspect(menu, entries):
        for thing in entries:
            d('---')
            for attrname in dir(thing):
                if attrname.startswith('get_') or attrname.startswith('is_'):
                    attr = getattr(thing, attrname)
                    try:
                        if callable(attr):
                            d(f'{attrname}(): {attr()}')
                        else:
                            d(f'{attrname}: {attr}')
                    except:
                        pass

except:
    from traceback import format_exc
    d(format_exc())

Поместите скрипт расширения в~/.local/share/nautilus-python/extensions. (Уведомление,nautilus-python, нетnautilus). Сделайте его исполняемым. Перезапустите Наутилус (см. выше).

Затем, когда вы щелкнете правой кнопкой мыши по выбранным файлам/папкам,MyInspectExtension.get_file_itemsвызывается, когда вы щелкаете правой кнопкой мыши по фону,MyInspectExtension.get_background_itemsназывается. Оба устанавливают свою запись в меню и в этом случае переходят кinspect.

Дополнительные примеры расширений можно найти в репозитории nautilus-python.

Кажется, что Nautilus постоянно перезагружает расширения, примерно каждую секунду. Вы можете увидеть это в журнале, когда экземпляр Nautilus открыт. Я не знаю, почему это так, но это может означать, что нельзя устанавливать слишком много и слишком тяжелых расширений.

Другие вопросы по тегам