Variable d'environnement PYTHONPATH… comment puis-je créer chaque sous-répertoire?

9

Je fais actuellement ceci:

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

Comment puis-je faire en sorte que le PYTHONPATH puisse inclure tout le sous-répertoire?

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

Réponses:

14

Ce n'est pas ainsi que PYTHONPATH fonctionne; PYTHONPATH traite son chemin de recherche différemment du shell PATH. Disons que je fais ceci:

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

Cela fonctionnera, en Python ( sys.pathinclura le répertoire courant):

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

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

Cependant, les sous-répertoires sont traités comme des packages lorsqu'il __init__.pyest présent dans le répertoire et sont ignorés par PYTHONPATH sinon:

$ 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

Pour accéder à quelque chose dans ce sous-répertoire, cela fonctionnerait:

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

Pour lancer une solution dans laquelle chaque sous-répertoire de votre PYTHONPATH est ajouté, vous devez ajouter explicitement chaque dossier à PYTHONPATH ou par sys.pathprogramme. Ce comportement est intentionnel et ne se comporte en rien comme shell PATH. Étant donné le soutien de l'interprète pour les packages à cet égard, il y a sûrement une meilleure façon d'accomplir ce que vous recherchez?

Jed Smith
la source
3
Mec, je souhaite que chaque site vérifie vos autres comptes avant de vous refuser des privilèges de publication. Ça craint de recommencer avec le représentant, en particulier avec des choses comme la limite d'une URL ... (J'avais plus de références pour vous, OP)
Jed Smith
1

Ce n'est pas ainsi que fonctionnent les variables d'environnement PATH - vous lui donnez le répertoire de niveau supérieur et il appartient à l'application de recursifier l'arborescence des répertoires si nécessaire.

EEAA
la source
Donc, si j'ai un fichier python sous /home/$USER/myfile.py Puis-je l'importer?
Alex
Bien sûr, pourquoi pas toi?
EEAA
1

Il est possible d'ajouter des sous-répertoires d'un répertoire à votre variable PYTHONPATH en utilisant le shell, bien sûr. J'utilise actuellement quelque chose de similaire à ce qui suit dans mon .bashrc:

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

Cela inclurait tous les sous-répertoires de votre dossier utilisateur à une profondeur de 2 dans l'arborescence. La commande find localise les répertoires ('-type d'), et les commandes sed et tr suivantes formatent la sortie de la manière habituelle des variables PATH.

Laisser '-maxdepth 2' inclurait tous les sous-répertoires de votre dossier personnel, ce qui est probablement beaucoup à rechercher. Peut-être que cela ne devrait être fait que dans votre répertoire $ HOME / repository / python-stuff.

Tournoiement en haut
la source