はい、可能です。たとえば、Nautilusを使用して、ファイルまたはディレクトリを引数としてプログラムを呼び出すことができます。呼び出しているプログラムは、任意のツールキットを使用して作成することも、単なるシェルスクリプトで作成することもできます。
小さな例または拡張:
from gi.repository import Nautilus, GObject
from urllib import unquote
PROGRAM_NAME = '/path/to/your/program'
class MyExtension(GObject.GObject, Nautilus.MenuProvider):
def __init__(self):
pass
def call_my_program(self, menu, files):
# Do whatever you want to do with the files selected
if len(files) == 0:
return
# Strip the URI format to plain file names
names = [ unquote(file.get_uri()[7:]) for file in files ]
argv = [ PROGRAM_NAME ] + names
GObject.spawn_async(argv, flags=GObject.SPAWN_SEARCH_PATH)
def get_file_items(self, window, files):
# Show the menu if there is at least on file selected
if len(files) == 0:
return
# We care only files (local files)
for fd in files:
if fd.is_directory() or fd.get_uri_scheme() != 'file':
return
item = Nautilus.MenuItem(name='MyExtensionID::MyMethodID',
label='Do something with my program...')
item.connect('activate', self.call_my_program, files)
return item,
拡張機能はGObjectIntrospection(Nautilus 3)を使用して記述されており、汎用的です。ファイルを引数として受け入れる任意の外部プログラムを呼び出すことができます。キーはGObject.spawn_async()
です。
get_file_items
ユーザーがファイルを操作するときにNautilusが呼び出すメソッドです。その中で、コンテキストメニューを(で)バインドできますNautilus.MenuItem()
。次に、そのメニューをプログラムを呼び出すメソッドに接続します(call_my_program()
)。
メソッドで他のフィルターを作成できますget_file_items
。たとえば、(を使用してfd.is_mime_type()
)テキストプレーンファイルが選択されている場合にのみコンテキストメニューを表示します。あなたはあなたが考えていることは何でもすることができます。非ブロック操作のみを実行することに注意してください。そうしないと、Nautilusをブロックする可能性があります。
拡張機能をテストするには、にインストールし~/.local/share/nautilus-python/extensions
ます。