22 de novembro de 2008

Manipulação do PATH de Python


Quem já trabalhou com Shell Script ou já fez algum curso mais aprofundado sobre um sistema operacional, sabe da importância da variável PATH. Pythonicamente falando, a variável PATH é uma lista de strings, onde cada elemento é um caminho (path) para um diretório do sistema onde há bibliotecas, executáveis, arquivos de documentação e coisas do tipo. Dessa forma, quando você manda o sistema executar um comando, ele procura em todos os diretórios presentes no PATH, verificando se o mesmo está lá. Se estiver, ele o executa. Senão:



Esta variável é fundamental para o funcionamento dos principais sistemas operacionais da atualidade (Linux, OS X e Windows), tanto que programas como o interpretador Python implementam um sistema similar de busca para seus módulos.

Como este tutorial explica, quando um módulo chamado spam (por exemplo) é importado, o interpretador procura por um arquivo chamado spam.py no diretório corrente (o diretório de onde o interpretador foi chamado) e no PATH de Python, para importá-lo.

Para visualizar o PATH de Python, basta importar o módulo sys e executar o comando sys.path. A listagem abaixo mostra a saída deste comando no OS X.

Python 2.5.1 (r251:54863, Apr 15 2008, 22:57:26)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python25.zip', '/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5', '/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-dynload', '/Library/Python/2.5/site-packages', '/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/PyObjC']
>>>
Listagem 1. Saída do comando sys.path no OS X Leopard.

No caso, path é uma variável do módulo sys que pode ser manipulada como qualquer lista. Desta forma, se quisermos, por exemplo, adicionar um diretório próprio de módulo, que, digamos, se localize em ~/Programming/Python/modules, basta executar o comando abaixo:

>>> sys.path.append("/Users/zezim/Programming/Python/modules")
Listagem 2. Adicionando um diretório ao PATH de Python.

Ainda há a possibilidade de se adicionar o diretório no início do PATH, para agilizar um pouco a busca:

>>> sys.path.insert(0, "/Users/zezim/Programming/Python/modules")
Listagem 3. Adicionando um diretório no início do PATH de Python.

Todas as modificações apresentadas funcionam apenas para a sessão aberta de Python, ou seja, depois de fechado o interpretador, todas as modificações serão perdidas. Para alterar permanentemente o PATH de Python, no OS X, adicione a seguinte linha no arquivo ~/.bash_profile (se este arquivo não existir, crie-o):

export PYTHONPATH="$PYTHONPATH:/Users/zezim/Programming/Python/modules"

Então force o BASH a ler o arquivo novamente (ou reinicie-o):

$ source ~/.bash_profile

Abra o interpretador Python e o novo diretório já estará no PATH do mesmo. Para se assegurar disto, liste novamente a variável (o diretório adicionado deverá aparecer na segunda posição da lista).

Apesar de ser possível alterar o PATH do interpretador Python, esta não é uma prática recomendada, pois pode colocar em risco a segurança do sistema, desconfigurar o interpretador e mesmo fazer com que os programas criados percam em padronização. O PEP8, inclusive aconselha a utilizar os diretórios disponibilizados pelo próprio interpretador para armazenagem de módulos (no OS X: /Lybrary/Python/<version>/site-packages). Portanto, apenas altere o PATH do interpretador Python se você realmente souber o que está fazendo.

Ainda é interessante ressaltar que, ao criar um módulo, deve-se nomeá-lo de acordo com o PEP8, para facilitar futuras importações:


Nomes de Módulos e Pacotes
Deveriam ser curtos e com todas as letras minúsculas. Underscores podem ser usados, mas seu uso é desaconselhado. Estes procedimentos se justificam pelo fato de que nomes de módulos tendem a se tornar nomes de arquivos e alguns sistemas de arquivos têm limitação quanto à quantidade de caracteres e quanto ao uso de caracteres não-ASCII (e.g., FAT).

Quando um módulo escrito em C ou C++ tem uma versão em Python que provê um nível mais alto de abstração, costuma-se nomeá-lo com um underscore no início (e.g., _socket).




Leia Também

2 comentários:

  1. Fala brow!!!!

    Boa postagem kra.

    Só a complementado gostaria de acrescentar duas dicas:
    1ª) o caminho de pesquisa por um módulo em Python segue a seguinte hierarquia:
    1. Diretório base do arquivo de nível superior.
    2. Diretórios do PYTHONPATH, caso esteja configurada) - próposito da postagem
    3. Diretórios onde contem as bibliotecas padrões do Python
    4. Conteúdo dos arquivos .pth, caso existam.

    2ª) Como você citou que a alteração dos caminhos de pesquisas do sistema podem acarretar falhas de segurança, o mais indicado seria trabalhar com arquivos com extensão .pth. Os arquivos .pth podem receber o caminho dos diretórios onde seus módulos estão presesentes. Por exemplo, podemos tratar a situação que você mesmo implantou sobre o caminho de pesquisa: /home/zezim/versaopropria.blogspot.com, poderiamos ter dentro de um dos três caminhos citados na dica 1, uma arquivo mymodulo.pth, contendo esse caminho.

    Com isso ao invés de alteramos o PYTHONPATH, apenas criarimos o fluxo de pesquisa paralelo, um desvio.

    Acredito que seja bastante proveitosas essas dicas.

    PS. é apenas um complemento a sua postagem está bem abrangente.

    Abraço.

    ResponderExcluir
  2. Fala, brother!

    Ótimo comentário! Como te disse, o Deitel aparentemente não aborda isso (pelo menos até o capítulo 9, onde estou). Esses arquivos .pth eu nunca ouvi falar, nem vi. Deixo, inclusive uma sugestão pra você fazer uma postagem no seu blog, ensinando a criá-los.

    Contudo, numa coisa concordamos: esta alteração deve ser feita com muito cuidado, pois pode prejudicar a segurança e a portabilidade do software.

    Abraço, cara!

    ResponderExcluir