2009-06-16 18 views
10

Środowisko: debian 4.0PYTHONPATH ignorowane

Python 2.4

mój 'projekt' jest zainstalowany w:

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

Ale chcę używać mojego kopię roboczą zamiast zainstalowanego jednego, który znajduje sie w:

/home/me/dev/projekt/src

Więc co mam zrobić jest:

export PYTHONPATH =/home/ja/dev/projekt/src

ipython

import foo # które jest w src

foo.__file__

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

zamiast:

/home/Me/dev/Project/src/projektu/foo .py

Jak to możliwe? Staram się sprawdzić Pathes (zrobiwszy eksport powyżej) i co widzę jest: sys

importowe, 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/projekt/src

+1

maszyna działa prawidłowo: > 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', ] * W urządzeniu nie działa poprawnie, */usr/lib/python2.4/site-packages * pojawia się wcześniej na liście ... –

+0

Zamiast tego dajmy kilka precyzyjnych pytań: Wszyscy zgadzają się, że jeśli ustawię PYTHONPATH na poprawną ścieżkę modułu, powinien on najpierw załadować ten moduł niezależnie? Wszyscy zgadzają się, że pyton próbuje załadować moduły zgodnie z kolejnością sys.path? Jeśli aboce jest poprawne, dlaczego python nie wstawia PYTHONPATH na początku sys.path (po jajach)? –

Odpowiedz

0

myślę skonfigurowaniu PYTHONPATH do katalogu/home/ja/build/pr oject/src, ponieważ/home/me/dev/project/src nie pojawia się w sys.path, ale/home/me/build/project/src robi.

+0

Dzięki David. sys.path zawiera/home/me/dev/project/src zamiast/home/me/build/project/src (jak zmieniłem nazwę niektórych rzeczy tam był błąd tam). Problem nadal występuje. –

1

Widzę "/usr/lib/python2.4/site-packages" na twojej ścieżce przed "/ home/me/dev/project/src", czy to ważne?Co się stanie, gdy przełączysz oba?

Od docs:

Kiedy PYTHONPATH nie jest ustawiony, lub gdy plik nie został znaleziony tam, poszukiwanie kontynuuje się w domyślnej ścieżce instalacji zależne

Więc może ty didn” • znaleźć swoją kopię roboczą na swojej PYTHONPATH, tak jak myślałeś?

+0

Myślę, że John ma rację, Python użyje modułu z najniższym indeksem w sys.path – wodemoneke

+0

Tak, to ma znaczenie. PYTHON, AFAIK, powinien najpierw wstawić PYTHONPATH (lub zaraz po ".") Moja PYTHONPATH jest poprawna. –

+1

Ale jeśli popełniłeś błąd, na przykład pomijając plik __init__.py w/home/me/dev/project/src, wtedy python przejdzie dalej, aby znaleźć pakiet prod w pakietach lokacji –

4

Nie wierzę, że masz jakąkolwiek kontrolę nad tym, gdzie PYTHONPATH zostanie wstawiony do rzeczywistej listy ścieżek. Ale nie jest to jedyny sposób modyfikacji ścieżki - możesz samodzielnie zaktualizować sys.path, zanim spróbujesz zaimportować projekt.

Edit: W Twoim konkretnym przypadku można zmodyfikować ścieżkę z

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

Więc nie mogę zmusić Pythona, gdzie szukać modułów? –

+0

Wiem o tym. Ale nie chcę dotykać kodu. –

+0

to działało dla mnie przy użyciu notebooka ipython, natomiast ustawienie PYTHONPATH w powłoce poleceń nie działało. Dzięki. – darKoram

6

Według dokumentacji Pythona, oczekuje się to zachowanie: https://docs.python.org/2.4/lib/module-sys.html:

Zauważ, że skrypt katalog jest wstawiony przed wprowadzone wpisy w wyniku PYTHONPATH .

Pod python-2.6 jest inna: http://docs.python.org/tutorial/modules.html#the-module-search-path

+1

Nie mam nic przeciwko jajkom. :) Ale dlaczego "/usr/lib/python2.4/site-packages" pojawia się przed moją ścieżką python? Jak mogę wymusić, aby PYTHONPATH była bardziej priorytetowa niż "/usr/lib/python2.4/site-packages" bez zmiany sys.path w pliku Pythona? –

+0

@joseph: zaktualizowano odpowiedź. – van

+0

@van. Nie rozumiem tego. Ustawiłem PYTHONPATH na coś poprawnego i ładuje najpierw to, co jest w pakietach witryny. Dziwaczny! –

0

To brzmi jak katalog src nie posiada plik __init__.py. To nie jest właściwy pakiet.

+0

Jak widać powyżej, jest jeden. –

+0

@ S.Lott przepraszam. To, co powiedziałem, to "__init __. Py" ("/ home/me/dev/project/src')" –

1

Nie jest to bezpośrednia odpowiedź na Twoje pytanie, ale możesz również użyć narzędzia virtualenv do stworzenia środowiska programistycznego. W tym virtualenv możesz zainstalować swój produkt w/home/me/dev/project/src jako pakiet programistyczny: "python setup.py develop".

W ten sposób nie trzeba ręcznie zmieniać PYTHONPATH. Po prostu aktywuj virtualenv, jeśli chcesz użyć kodu programistycznego.

5

Znalazłem problem (wcześniej przeoczyłem, gdy ktoś wskazał mi, że mam Where is Python's sys.path initialized from?).

Wygląda na to, że easy_install tworzy plik pth /usr/lib/python2.4/site-packages/easy-install.pth, który jest następnie ładowany przez witrynę site.py. Spowoduje to wstawienie ścieżki pakietu lokacji na ścieżce sys przed PYTHONPATH. Niemiły.