PYTHONPATH variable de entorno ... ¿cómo hago cada subdirectorio después?

9

Actualmente hago esto:

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

¿Cómo puedo hacer que PYTHONPATH pueda incluir todo el subdirectorio?

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

Respuestas:

14

Así no es como funciona PYTHONPATH; PYTHONPATH trata su ruta de búsqueda de manera diferente a la ruta de shell. Digamos que hago esto:

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

Esto funcionará en Python ( sys.pathincluirá el directorio actual):

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

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

Sin embargo, los subdirectorios se tratan como paquetes cuando __init__.pyestán presentes en el directorio, y PYTHONPATH los ignora de lo contrario:

$ 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 llegar a algo en ese subdirectorio, esto funcionaría:

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

Para lanzar una solución donde se agregue cada subdirectorio en su PYTHONPATH, debe agregar explícitamente cada carpeta a PYTHONPATH o mediante sys.pathprogramación. Este comportamiento es intencional y no se comporta en nada como Shell PATH. Dado el apoyo del intérprete para los paquetes a este respecto, ¿seguramente hay una mejor manera de lograr lo que busca?

Jed Smith
fuente
3
Hombre, desearía que cada sitio verificara tus otras cuentas antes de negarte los privilegios de publicación. Es una mierda comenzar de nuevo con el representante, especialmente con cosas como el límite de una URL ... (Tenía más referencias para usted, OP)
Jed Smith
1

No es así como funcionan las variables PATH de entorno: le da el directorio de nivel superior y depende de la aplicación repetir el árbol de directorios si es necesario.

EEAA
fuente
Entonces, si tengo un archivo de Python en /home/$USER/myfile.py ¿Puedo importar esto?
Alex
Claro, ¿por qué no pudiste?
EEAA el
1

Es posible agregar subdirectorios de un directorio a su variable PYTHONPATH usando el shell, por supuesto. Actualmente uso algo similar a lo siguiente en mi .bashrc:

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

Esto incluiría todos los subdirectorios de su carpeta de usuario a una profundidad de 2 en el árbol. El comando find localiza los directorios ('-type d'), y los siguientes comandos sed y tr dan formato a la salida de la manera habitual de las variables PATH.

Dejar '-maxdepth 2' incluiría todos los subdirectorios de su carpeta de inicio, que probablemente sea mucho para buscar. Quizás esto solo debería hacerse en su directorio $ HOME / repository / python-stuff.

girar
fuente