![Nautilus 脚本](https://linux22.com/image/1033758/Nautilus%20%E8%84%9A%E6%9C%AC.png)
我想用 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
。
完成所有这些操作后,您就可以从scripts
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 实例打开时,您可以在日志中看到这一点。我不知道为什么会这样,但这可能表明您可能没有安装太多和太重的扩展。