2009-06-16 13 views
10

Ambiente: Debian 4.0PYTHONPATH ignorato

Python 2.4

mio 'progetto' è installato in:

/usr/lib/python2.4/site-packages/project.

Ma voglio usare la mia copia di lavoro al posto di quello installato che si trova in:

/home/me/dev/progetto/src

Quindi quello che faccio è:

export PYTHONPATH =/home/me/dev/progetto/src

ipython

import foo # che è in src

foo.__file__

*/usr/lib/python2.4/site-packages/project/foo.py* 

invece di:

/home/me/dev/progetto/src/progetto/foo .py

Come mai? Cerco di controllare i sentieri (dopo aver fatto l'esportazione sopra) e quello che vedo è: sys

importazione, os

sys.path

[ '', '/ usr/bin ', ' /usr/lib/python2.4/site-packages ', '/home/me/dev/project/src ', ' /usr/lib/python24.zip ', '/usr/lib/python2.4 ', ' /usr/lib/python2.4/plat-linux2 ', ' /usr/lib/python2.4/lib-tk ', '/u sr/lib/python2.4/lib-dynload ', ' /usr/local/lib/python2.4/site-packages ', ' /usr/lib/python2.4/site-packages/PIL ', '/var/lib/python-support/python2.4', '/usr/lib/python2.4/site-packages/IPython/Extensions', '/home/me/.ipython']

os.environ [ 'PYTHONPATH']

/home/me/dev/progetto/src

+1

macchina funziona correttamente: > export PYTHONPATH = foo > ipython > import sys > * sys.path = [ '/etc/python2.4', '/ home/me/foo ', ' /usr/lib/python24.zip ', ' /usr/lib/python2.4 ', ' /usr/lib/python2.4/plat-linux2 ', '/usr/lib/python2 .4/lib-tk ', ' /usr/lib/python2.4/lib-dynload ', ' /usr/local/lib/python2.4/site-packages ', '/usr/lib/python2 .4/site-packages ', '/var/lib/python-support/python2.4', ] * Nella macchina non funziona correttamente, */usr/lib/python2.4/site-packages * va prima nella lista ... –

+0

Facciamo invece alcune domande precise: Tutti sono d'accordo sul fatto che se imposto il PYTHONPATH su un percorso di modulo valido, dovrebbe prima caricare questo modulo, indipendentemente? Tutti concordano sul fatto che Python prova a caricare i moduli seguendo l'ordine di sys.path? Se aboce è corretto, perché python non inserisce PYTHONPATH all'inizio di sys.path (dopo le uova)? –

risposta

0

penso di impostare PYTHONPATH a/home/me/costruire/pr oject/src poiché/home/me/dev/project/src non appare in sys.path, ma/home/me/build/project/src fa.

+0

Grazie David. sys.path include/home/me/dev/project/src invece/home/me/build/project/src (dato che ho rinominato alcune cose c'era un errore). Il problema persiste. –

1

Vedo '/usr/lib/python2.4/site-packages' nel tuo percorso prima di '/ home/me/dev/project/src', importa?Cosa succede quando cambi i due?

Dalla documentazione:

Quando PYTHONPATH non è configurata, o quando il file non viene trovato, la ricerca continua su un percorso predefinito dipendente

Così forse si didn' Trova la tua copia di lavoro sul tuo PYTHONPATH come avevi pensato?

+0

Penso che John abbia ragione, Python userà il modulo con l'indice più basso in sys.path – wodemoneke

+0

Sì, quello conta. PYTHON, AFAIK, deve inserire prima PYTHONPATH (o subito dopo ".") My PYTHONPATH è corretto. –

+1

Ma se hai commesso un errore, come omettere il file __init__.py in/home/me/dev/project/src, python andrà a cercare il pacchetto prod in pacchetti del sito –

4

Non credo che tu abbia alcun controllo su dove PYTHONPATH viene inserito nella lista dei percorsi effettivi. Ma non è l'unico modo per modificare il percorso: puoi aggiornare sys.path tu stesso, prima di provare a importare il progetto.

Edit: comportamento Nel tuo caso specifico, è possibile modificare il percorso con

import sys 
sys.path.insert(2, '/home/me/dev/project/src') 
+1

Quindi non posso forzare Python dove cercare i moduli? –

+0

Lo so. Ma non voglio toccare il codice. –

+0

ha funzionato per me usando il notebook ipython, mentre l'impostazione di PYTHONPATH sulla shell dei comandi non lo ha fatto. Grazie. – darKoram

6

Secondo la documentazione python, questo è previsto: https://docs.python.org/2.4/lib/module-sys.html:

Si noti che lo script la directory è inserita prima dello le voci inserite come risultato di PYTHONPATH .

Sotto python-2.6 è diverso: http://docs.python.org/tutorial/modules.html#the-module-search-path

+1

Sto bene con le uova. :) Ma perché "/usr/lib/python2.4/site-packages" viene prima del mio percorso Python? Come posso forzare PYTHONPATH a essere più prioritario rispetto a "/usr/lib/python2.4/site-packages" senza modificare sys.path all'interno del file python? –

+0

@joseph: aggiornata la risposta. – van

+0

@van. Non capisco Ho impostato il parametro PYTHONPATH su qualcosa di corretto e prima carica quello che c'è nei pacchetti del sito. Bizzarro! –

0

Sembra che la directory src non dispone di un file di __init__.py. Non è un pacchetto adeguato.

+0

Come vedrai sopra, ce n'è uno. –

+0

@ S. scusatemi. Quello che ho detto è "__init __. Py' è lì (in'/home/me/dev/project/src') " –

1

Non è una risposta diretta alla domanda, ma è possibile utilizzare anche un virtualenv per creare un ambiente di sviluppo. In tale virtualenv puoi quindi installare il tuo prodotto in/home/me/dev/project/src come pacchetto di sviluppo: "python setup.py develop".

In questo modo non è necessario modificare manualmente il PYTHONPATH. Basta attivare il virtualenv se si desidera utilizzare il codice di sviluppo.

5

Ho trovato il problema (mi sono perso presto quando qualcuno mi ha indirizzato a Where is Python's sys.path initialized from?).

Sembra che easy_install crei un file pth /usr/lib/python2.4/site-packages/easy-install.pth che viene quindi caricato da site.py. Questo inserisce il percorso dei pacchetti del sito nel percorso sys prima di PYTHONPATH. Non bello.