Como modificar globalmente o PYTHONPATH padrão (sys.path)?

33

Em um sistema Ubuntu (10.10), tenho um pacote Python que se instala no /usr/local/lib/python2.6/site-packages/. Isso não está contido no caminho padrão (sys.path). Como adiciono este diretório ao caminho?

Definir a $PYTHONPATHvariável de ambiente é uma solução, é claro, mas estou procurando uma maneira mais elegante de fazer isso. Por exemplo, easy_installtambém coloca pacotes instalados nele, meu sys.path se parece com isso:

['', '/usr/local/lib/python2.6/dist-packages/keyring-0.5.1-py2.6.egg', 
'/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk',  
'/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', 
'/usr/local/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages', 
'/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/pymodules/python2.6', 
'/usr/lib/pymodules/python2.6/gtk-2.0']

portanto, o caminho obviamente não é o padrão incorporado no binário Python.

Existe um único arquivo de configuração que contém as entradas acima? Ou de que maneira é possível modificá-lo?

Latanius
fonte

Respostas:

27

A documentação do módulo do site e o Caminho de pesquisa de modificação do Python parecem ser o que você está procurando.

Tanto quanto eu entendo, essas entradas estão sendo adicionadas sys.pathpor:

  • /usr/lib/python2.6/site.py
  • /usr/lib/python2.6/dist-packages/site.py
    (Altere 2.6 para sua versão do Python.)

A maneira mais fácil de alterá-lo é adicionar um arquivo /usr/local/lib/python2.6/dist-packages/site-packages.pthcontendo ../site-packages.

Como alternativa, talvez você possa ensinar o pacote a usar site.getsitepackages()?

Mikel
fonte
1
graças, funciona perfeitamente :) (eu acabei adicionando um arquivo .pth para /usr/local/python2.6/dist-packages, contendo "../site-packages")
Latanius
1
Você também pode criar um módulo chamado sitecustomize.pyque site.pytenta importar e modificar sys.pathlá.
TestUser16418
5

Você pode criar um novo arquivo chamado /etc/profile.d/local_python.shcom o conteúdo

PYTHONPATH="/usr/local/lib/python2.6/site-packages/":"${PYTHONPATH}"
export PYTHONPATH

O que definirá a PYTHONPATHvariável para todos os usuários conectados no seu sistema.

TestUser16418
fonte
7
Isso realmente não é universal. O mecanismo /etc/profile.d funcionará apenas para shells de login para pessoas com shells que usam /etc/profile.d (bash / ksh / zsh). Tenho certeza que os usuários do csh não verão essa alteração. Além disso, será ignorado nos trabalhos cron / at.
Rich Homolka
2
esta é uma boa maneira de definir variáveis de ambiente globais (ainda outra coisa que eu aprendi hoje), mas como eu mencionei no post, eu estava procurando uma maneira mais Pythonic :)
Latanius
4

Gostaria de resumir minhas descobertas sobre a modificação de caminho do python. Existem duas maneiras de fazer isso.

  • arquivo .pth
  • PYTHONPATH

Qualquer arquivo .pth encontrado no caminho padrão (veja abaixo) terá seu conteúdo incluído sys.path. O formato do referido arquivo .pth é simples: um caminho (pasta) por linha. Surpreendentemente, os caminhos podem ser absolutos ou relativos ao arquivo .pth .

O caminho padrão é onde o intérprete reside e <some-prefix>/lib/python<version>/site-packagesonde <some-prefix>normalmente está /usr/.

PYTHONPATHé uma variável ambiental do seu sistema operacional. Nos sistemas unix, você os lista env. A modificação global dessas variáveis ​​é feita por meio de scripts .sh dentro da /etc/profile.d/pasta, como mencionado por @ TestUser16418.

katomaso
fonte
2
É PYTHONPATH sem "_"
heroxbd
1

Por exemplo, se você deseja importar o sudsmódulo que está disponível como um .eggarquivo:

egg_path = '/home/shahid/suds_2.4.egg'

sys.path.append(egg_path)

import suds
# ... rest of code
Mohammad Shahid Siddiqui
fonte