Variável de ambiente PYTHONPATH ... como faço para criar todos os subdiretórios depois?

9

Atualmente, faço isso:

PYTHONPATH=/home/$USER:/home/$USER/respository:/home/$USER/repository/python-stuff

Como posso fazer para que o PYTHONPATH inclua todo o subdiretório?

PYTHONPATH = /home/$USER/....and-all-subdirectories
Alex
fonte

Respostas:

14

Não é assim que PYTHONPATH funciona; PYTHONPATH trata seu caminho de pesquisa de maneira diferente do PATH do shell. Digamos que eu faça isso:

$ mkdir /home/jsmith/python
$ cd /home/jsmith/python
$ touch a.py b.py

Isso funcionará, em Python ( sys.pathincluirá o diretório atual):

$ cd /
$ PYTHONPATH=/home/jsmith/python python2.6

Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51)
>>> import a, b   # Works
>>> quit()

No entanto, os subdiretórios são tratados como pacotes quando __init__.pyestão presentes no diretório e são ignorados pelo PYTHONPATH, caso contrário:

$ mkdir /home/jsmith/python/pkg
$ cd /home/jsmith/python/pkg
$ touch __init__.py c.py d.py
$ cd /
$ PYTHONPATH=/home/jsmith/python python2.6

Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51)
>>> import a, b   # Works
>>> import c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named c

Para chegar a algo nesse subdiretório, isso funcionaria:

>>> from pkg import c   # Works
>>> import pkg.c        # Works

Para rolar uma solução na qual todos os subdiretórios do seu PYTHONPATH são adicionados, você precisa adicionar explicitamente todas as pastas ao PYTHONPATH ou sys.pathprogramaticamente. Esse comportamento é intencional e não se comporta como o PATH do shell. Dado o suporte do intérprete a pacotes nesse sentido, certamente há uma maneira melhor de realizar o que você procura?

Jed Smith
fonte
3
Cara, eu gostaria que cada site verifique suas outras contas antes de negar que você publique privilégios. É chato começar de novo com rep, especialmente com coisas como o limite de um URL ... (eu tinha mais referências para você, OP)
Jed Smith
1

Não é assim que as variáveis ​​PATH do ambiente funcionam - você fornece o diretório de nível superior e cabe ao aplicativo recursar a árvore de diretórios, se necessário.

EEAA
fonte
Portanto, se eu tiver um arquivo python em /home/$USER/myfile.py Posso importar isso?
3140 Alex
Claro, por que você não pôde?
EEAA
1

É possível adicionar subdiretórios de um diretório à sua variável PYTHONPATH usando o shell, é claro. Atualmente, uso algo semelhante ao seguinte no meu .bashrc:

export PYTHONPATH="$(find $HOME/ -maxdepth 2 -type d | sed '/\/\./d' | tr '\n' ':' | sed 's/:$//')"

Isso incluiria todos os subdiretórios da sua pasta de usuário a uma profundidade de 2 na árvore. O comando find localiza os diretórios ('-type d'), e os seguintes comandos sed e tr formatam a saída da maneira usual das variáveis ​​PATH.

Sair de '-maxdepth 2' incluiria todos os subdiretórios da sua pasta pessoal, o que provavelmente é muito para pesquisar. Talvez isso deva ser feito apenas no diretório $ HOME / repository / python-stuff.

spinup
fonte