Variabile d'ambiente PYTHONPATH ... come posso fare successivamente ogni sottodirectory?


9

Attualmente lo faccio:

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

Come posso farlo in modo che PYTHONPATH possa includere tutto nella sottodirectory?

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

Risposte:


14

Non è così che funziona PYTHONPATH; PYTHONPATH tratta il suo percorso di ricerca in modo diverso dal PATH della shell. Diciamo che lo faccio:

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

Questo funzionerà, in Python ( sys.pathincluderà la directory corrente):

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

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

Tuttavia, le sottodirectory vengono trattate come pacchetti quando __init__.pyè presente nella directory e vengono ignorate da PYTHONPATH altrimenti:

$ 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

Per arrivare a qualcosa in quella sottodirectory, questo funzionerebbe:

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

Per creare una soluzione in cui viene aggiunta ogni sottodirectory di PYTHONPATH, è necessario aggiungere esplicitamente ogni cartella a PYTHONPATH o a livello di sys.pathprogrammazione. Questo comportamento è intenzionale e non si comporta come il PATH della shell. Dato il supporto dell'interprete per i pacchetti in questo senso, sicuramente c'è un modo migliore per realizzare ciò che stai cercando?


3
Amico, vorrei che ogni sito controllasse i tuoi altri account prima di negarti la pubblicazione dei privilegi. Fa schifo ricominciare con rep, specialmente con cose come il limite di un URL ... (Ho avuto più riferimenti per te, OP)
Jed Smith

1

Non è così che funzionano le variabili PATH dell'ambiente: gli dai la directory di livello superiore e spetta all'applicazione ricorrere all'albero delle directory se necessario.


Quindi, se ho un file Python in /home/$USER/myfile.py Posso importarlo?
Alex

Certo, perché non hai potuto?
EEAA

1

Naturalmente è possibile aggiungere sottodirectory di una directory alla variabile PYTHONPATH usando la shell. Attualmente uso qualcosa di simile al seguente nel mio .bashrc:

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

Ciò include tutte le sottodirectory della cartella utente a una profondità di 2 nella struttura. Il comando find individua le directory ('-type d'), e i seguenti comandi sed e tr formattano l'output nel solito modo delle variabili PATH.

Tralasciando '-maxdepth 2' includerebbe tutte le sottodirectory della cartella home, che probabilmente è molto da cercare. Forse questo dovrebbe essere fatto solo nella directory $ HOME / repository / python-stuff.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.