Posted by Laudeci Oliveira in Python, Ubuntu | 7 comments
Python-Nautilus (Extending Nautilus using Python)

Por muito tempo tentei encontrar uma forma de interagir com o Nautilus utilzando Python ou qualquer outra linguagem de programação.
Depois de muitas tentativas descobri uma biblioteca que possibilita essa integração com o Nautilus utilizando python….
Aparentemente meus problemas estavam resolvidos, triste engano!!!
Junto com a descoberta da biblioteca veio uma nova duvida:
Como colocar tudo para funcionar????
A documentação não é clara, nem tampouco os exemplos contidos nas pastas
/usr/share/doc/python-nautilus/examples e /usr/share/doc/python-nautilus/
ajudam a decifrar o grande enigma da linha “import nautilus” não funcionar corretamente e deixar o usuário imaginando que o python não consegue encontrar a biblioteca.
Bom, depois de muito tentar, descobri que:
O script só funciona se for colocado em uma das seguintes pastas:
/usr/lib/nautilus/extensions-1.0/python ou
~/.nautilus/python-extensions
Bom… utilizando um script criado pelo meu amigo Yguaratã em seu blog, fiz algumas modificações e criei este script que pode ser acessado através de um menu customizado sem ter q acessar o menu de scripts do Nautilus.


O código completo pode ser obtido clicando aqui.
Bom, depois de esclarecer o problema da biblioteca, podemos explicar como a parte de integração com o Nautilus funciona.
Primeiramente devemos fazer o import das seguintes bibliotecas:
#bibliotecas utilizadas para gerenciar
#a forma padrão de como o Nautilus envia
#os caminhos dos arquivos selecionados
import urllib
import urlparse
#biblioteca utilizada na interação
#com o Nautilus.
#esse import só funciona quando os arquivos
#estão armazenados nas pastas mencionadas acima
import nautilus
Para que uma classe possa fazer parte de um menu do Nautilus (geralmente o menu Editar) ela deve implementar a classe nautilus.MenuProvider conforme mostrado abaixo:
class CreateFilesExtension(nautilus.MenuProvider):
Essa classe fará com que um menu seja adicionado a interface principal do Nautilus.
O método get_file_items é exectuado pelo Nautilus sempre que um objeto é selecionado na janela do Nautilus, é nesse momento que devemos validar os objetos que serão manipulados pelo nosso scrip, e, adicionar a entrada do nosso menu customizado.
def get_file_items(self, window, files):
for file in files:
if not file.get_mime_type() in SUPPORTED_FORMATS:
return
#create our menu if selected item is a folder or a collection of folders
item = nautilus.MenuItem('Nautilus::Create_Files_Extension',
'Create files in folders',
'Create files in selected folders')
item.connect('activate', self.menu_activate_cb, files)
return item,
Um outro método deve ser criado para executar o código que será disparado quando o menu da sua classe for criado.
def menu_activate_cb(self, menu, files):
# Strip leading file://
for file in files:
self.foldersName.append(urllib.unquote(file.get_uri()[7:]))
c = CreateNewFile(self.foldersName)
a = c.run()
Após adicionar or arquivo com o script em uma das pastas que o Nautilus utiliza como container de extensões, a extensão criada só irá surtir efeito quando Nautilus for reiniciado.
Isso pode ser feito usando dois comandos básicos no terminal:
$ nautilus -q
ou
$ killall nautilus
Para instalar a biblioteca no Ubuntu digite a seguinte linha no terminal:
$ sudo apt-get install python-nautilus
Espero que esse post possa ajudar várias pessoas que, como eu, gostaria de adicionar novas funcionalidades ao Nautilus para executar tarefas diárias sem a necessidade de ter as horriveis entradas para o menu de scripts do Nautilus.
[]’s

mto bom. vai ser bem útil num projeto que ainda farei
Essa modificação foi simplesmente genial! É o que eu queria e não sabia que era possível. Obrigado pelos devidos merecimentos!
[]’s
Olá, Pretto. Legal o artigo. Dá uma explicada legal de como fazer plugin pro nautilus. Só não entendi/concordei com:
“horriveis entradas para o menu de scripts do Nautilus”
O que você quer dizer com isso? Você já ouviu falar de nautilus-actions? É uma alternativa bem legal também.
Continue escrevendo!
Wendell.
Luogo interessante, buon disegno, lo gradisco, signore! =)
Hello, my name is Alex, i’m a newbie here. I really do like your resource and really interested in things you discuss here, also would like to enter your community, hope it is possible:-) Cya around, best regards, Alex!
Cara, parabens pelo seu artigo. Muito bom. Ainda tou engatinhando no Python. Engatinhando mesmo. Mas já deu, só em ver os exemplos, fazer umas coisinhas bestas.
Você sabe onde posso pegar uma documentação melhor para ver como funciona esta questão da integração com o Nautilus, etc etc etc ?
Fiquei sem entender o que seria este primeiro argumento do método MenuItem.
Valeu camarada.
Abraços,
Diego
Muito legal a sua dica, coloquei uma referência sucinta no meu blog para esta dica, acessível neste link. Gostaria de acessar a posteriori alguns scripts para tarefas como corrigir o charset de arquivos importados do windows, tarefa comum em meu ambiente de trabalho.
Valeu!