Nautilus 脚本

Nautilus 脚本

我想用 Python 编写一个 Nautilus 脚本。可以吗?如果可以,我该怎么做?

答案1

Nautilus 脚本

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

完成所有这些操作后,您就可以从scriptsNautilus 右键菜单的子菜单中访问该脚本。

nautilus 脚本菜单

也可以看看:https://help.ubuntu.com/community/NautilusScriptsHowto

Nautilus 扩展

Nautilus 扩展比脚本更灵活 - 例如,它们可用于将项目直接添加到上下文菜单。有可用的 Python 绑定(python-nautilus)。

访问网页此库并查看文档了解更多信息。

答案2

这是一个脚本模板和一个扩展模板。

要重新启动 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(见上文)。在 Nautilus 中选择一些文件或文件夹并右键单击。脚本出现在“脚本”菜单项下。

扩展

扩展稍微复杂一些,但可以用它们做更多的事情,例如可以实现链式菜单。

首先nautilus-python使用您的包管理器进行安装。

  • Fedora:sudo dnf install nautilus-python<- 可以确认,有效
  • Debian:sudo apt install nautilus-python
  • 拱:sudo pacman -Sy python-nautilus

来源

每个扩展都需要创建一个扩展GObject.GObject和的类Nautilus.MenuProvider

我的扩展名.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)。 使其可执行。 重新启动 Nautilus(参见上文)。

然后,当您右键单击所选文件/文件夹时,MyInspectExtension.get_file_items将调用,当您右键单击背景时,MyInspectExtension.get_background_items将调用。两者都会安装其菜单项,并且在本例中,转发到inspect

更多扩展示例可以在nautilus-python 仓库

Nautilus 似乎会不断地重新加载扩展,大约每秒一次。当 Nautilus 实例打开时,您可以在日志中看到这一点。我不知道为什么会这样,但这可能表明您可能没有安装太多和太重的扩展。

相关内容