Как я могу написать скрипты 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 открыт. Я не знаю, почему это так, но это может означать, что нельзя устанавливать слишком много и слишком тяжелых расширений.