python

Editando o Registro do Windows em Python com o _winreg

Primeiramente, um alerta aos leitores do blog: este artigo a seguir é um artigo de programação. Fala sobre recursos da linguagem de programação Python. Se você não é programador, nem gosta dessas coisas, pode continuar visitando o blog (tá acompanhando Warning Zone?), apenas pule este post, que foi traduzido do artigo de Mike Driscoll, do blog Mouse vs. Python


A biblioteca padrão de Python é conhecida por incluir vários módulos e pacotes práticos, que podem ser usados sem necessidade de instalar nada mais. Esta é uma das principais razões de a bibliotca padrão ser frequentemente referenciada como "baterias incluídas". Assim, não deve ser surpresa o fato de o Python incluir um módulo só para Windows, que permita editar o Registro do Windows. Esse módulo em particular recebe o estranho nome de _winreg (estranho devido ao sublinhado no início). Neste artigo, aprenderemos como começar a trabalhar com o Registro usando essa bateria.

Lendo o Registro

Usar o Python para ler dados a partir do registro é muito fácil. No exemplo a seguir, procuraremos pelo caminho onde o Outlook Express está instalado:

from _winreg import *
key = OpenKey(HKEY_LOCAL_MACHINE, r'Software\Microsoft\Outlook Express', 0, KEY_ALL_ACCESS)
QueryValueEx(key, "InstallRoot")

Na minha máquina, isso retorna a seguinte tupla: (u’%ProgramFiles%\\Outlook Express’, 2). A tupla combina o valor do registro com o tipo de valor. Há dois outros métodos de consulta que podem ser chamados: QueryInfoKey e QueryValue. O primeiro lhe dá informações internas sobre a chave em si, na forma de três inteiros; enquanto o último recupera apenas o dado para o primeiro valor da chave que tenha nome NULL. A documentação recomenda que você use QueryValueEx sempre que possível.

Devemos explicar rapidamente o que está acontecendo no código anterior. A função OpenKey recebe uma constante HKEY*, uma string de caminho da subchave, um inteiro reservado (que precisa ser igual a zero) e a máscara de segurança. Neste caso, passamos KEY_ALL_ACCESS, que nos dá controle total daquela chave. Como tudo o que fizemos foi ler a chave, provavelmente deveríamos ter utilizado KEY_READ ao invés da outra constante. Já quanto ao QueryValueEx, ele recebe somente o objeto chave e o nome do campo que queremos consultar.

Escrevendo no Registro

Se você andou lendo o blog do Mike ultimamente, provavelmente já viu o módulo _winreg sendo utilizado para escrita no registro. Isso será apenas revisto por você, assim fique à vontade para pular esta sessão. Começaremos com um exemplo prático. No código a seguir, vamos definir a página inicial do Internet Explorer. Como sempre, favor notar que a edição de entradas no Registro pode ser muito perigosa. Esteja certo de ter feito backup do seu registro antes de tentar editá-lo. Agora, que comece o espetáculo!

keyVal = r'Software\Microsoft\Internet Explorer\Main'
try:
    key = OpenKey(HKEY_CURRENT_USER, keyVal, 0, KEY_ALL_ACCESS)
except:
    key = CreateKey(HKEY_CURRENT_USER, keyVal)
SetValueEx(key, "Start Page", 0, REG_SZ, "http://bardo.ws/")
CloseKey(key)

No código acima, tentamos abrir a seguinte chave: HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main e definir o valor “Start Page” para este blog. Se a abertura falha, isso geralmente é devido ao fato de a chave não existir, assim tentamos criá-la no nosso manipulador de exceção. Então usamos SetValueEx para definir o valor e, como todo bom programador, nós fechamos a chave a partir do momento em que não precisaremos mais manuseá-la. Se você pulou o comando CloseKey, o fato de o programa ser feito em Python fará com que o Python o feche para você. Porém, se você continuar trabalhando nesta chave, você pode ter uma violação de acesso ao tentar abrí-la com ela já aberta. Assim, a lição que fica é que sempre feche uma chave quando terminar de mexer nela.

Outros Métodos do _winreg

Há vários outros métodos na biblioteca _winreg além dos que foram mostrados. O método DeleteKey é prático quando você precisa remover uma chave. Infelizmente, tenho passado por ocasiões em que preciso remover chaves recursivamente, como acontece numa desinstalação, e o _winreg ainda não tem uma forma embutida de fazer isso. Você pode escrever o seu próprio, é verdade, ou pode baixar um wrapper que faça isso por você, como o YARW (Yet Another Registry Wrapper).

DeleteValue é similar ao DeleteKey, exceto que você apaga apenas um valor. Sim, isso é bem óbvio. Se você quer escrever seu próprio código de eliminação recursiva, provavelmente vai querer dar uma olhada na forma como EnumKey e EnumValue enumeram as chaves e valores, respectivamente. Vamos ver então como usar o EnumKey:

from _winreg import EnumKey, HKEY_USERS
 
try:
    i = 0
    while True:
        subkey = EnumKey(HKEY_USERS, i)
        print subkey
        i += 1
except WindowsError:
    # WindowsError: [Errno 259] No more data is available    
    pass

O código acima irá percorrer todo o HKEY_USERS, imprimindo as subchaves na saída padrão até que termine e um WindowsError seja gerado. Realmente este código não desce para as subchaves, mas deixarei essa tarefa como um exercício para o leitor que quiser praticar.

O último método de que iremos falar aqui é o ConnectRegistry. Ele é útil quando nós precisamos editar o Registro de uma máquina remota. Ele só aceita dois argumentos: o nome do computador e a chave à qual se conectar (por exemplo, HKEY_LOCAL_MACHINE). Note que quando conectamos máquinas remotas, nós só podemos editar certas chaves, enquanto outras estão indisponíveis.

Encerrando

Espero que este artigo tenha sido útil para você e tenha lhe dado um montão de ideias para projetos futuros. Eu tenho muitos scripts de login que usam essa maravilhosa biblioteca, e um par que usa o YARW. Tem sido muito útil até agora e eu espero que também seja para você.

Leia Também

xLance em Python

xLance em Python

Considerando a dificuldade de instalar Gtk2Perl em Windows (não que eu use Windows, mas quero fazer softwares que sejam úteis para mais pessoas, mesmo que os softwares sejam simples e mínimos como os que faço, além do mais pode ser necessário fazer GUI para Windows onde trabalho...); e também a falta de uma distribuição com uma licença minimamente adequada do Perl para Windows (até hoje só encontrei o ActivePerl), comecei a estudar Python com interface tkinter (baseada no Tk).

O Python oferece instalador para Windows, que já vem com suporte a Tkinter. Ou seja, se eu faço um software em Python/Tkinter, é fácil rodá-lo lá também. Apesar do visual tosco que esses softwares adquirem, o que me importa hoje é a portabilidade (e ser uma boa linguagem de script também, nem me venham querendo empurrar Java...).

O primeiro teste com estas tecnologias foi a tentativa de refazer o simulador de lance de dados xlance, que faz tempo que fiz em Perl+Gtk (e recentemente atualizei para usar Gtk2). Vejam na imagem como ficou.

Ainda está incompleto: não sorteia nada, só números, nem lida com arquivo de configuração ainda. Mas é um começo e mostrou que a idéia de mudar pra Python/Tkinter pode mesmo ser uma boa.

Baixe o Python se quiser testar o xlance 0.11. Desta vez ainda está em apenas um arquivo de pouco mais de 100 linhas. Numa próxima versão mais completa, eu refaço pacote e coisa e tal...

PortablePython

PortablePython

Outra vantagem do Python em relação a outras linguagens de scripts é a existência do Portable Python.

Você conhece PortableApps? É uma forma de rodar programas no Windows a partir do pendrive, sem precisar instalar nada. Muito útil se você, por exemplo, é cliente freqüente de lan house. Você pode ter o Firefox, o Thunderbird, o VLC e até mesmo o OpenOffice.org rodando a partir do seu pendrive, sem precisar de acesso como administrador às máquinas e sem incomodar ninguém.

A lista de programas que funcionam dessa forma é enorme. Dentre eles, está o Portable Python. Todo o ambiente Python: o interpretador e até mesmo o editor Scite. Vale a pena, viu? (ainda não sou usuário freqüente de lanhouses, mas gostei de saber desse projeto)

Claro que você pode utilizar o Portable Python sozinho, mas se você instalar o PortableApps, fica mais interessante, já que ganha um menu. Neste caso, descompacte o Portable Python para a pasta PortableApps no dispositivo com PortablApps já instalado.

Pense como um cientista da computação, usando Python

Livro em PDF

O livro "How to Think Like a Computer Scientist: Learning with Python", de Allen Downey, Jeffrey Elkner e Chris Meyers, trata de conceitos básicos de Programação, com o intuito de ser utilizado como material didático de cursos de Ciência da Computação.

Este livro foi traduzido para português (o trabalho ainda está sendo refinado, mas está quase pronto), trabalho que iniciou com Cláudio Berrondo e contou até o momento com a colaboração de mais dezesseis pessoas.

Não participei da equipe de tradução, mas como o projeto é muito bom e eu gostaria de ter o material em formato PDF, em duas colunas, resolvi "diagramar" o livro. É esta versão diagramada do livro que disponibilizo aqui a partir de agora.

O projeto de tradução tem um site, onde você pode tanto acompanhar o progresso como discutir e colaborar ativamente com o que falta.

Páginas

Subscribe to RSS - python

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo.so' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_odbc.dll' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_odbc.dll: cannot open shared object file: No such file or directory in Unknown on line 0