Jak globalnie zmodyfikować domyślną ścieżkę PYTHONPATH (sys.path)?

33

W systemie Ubuntu (10.10) mam pakiet Python, który się instaluje /usr/local/lib/python2.6/site-packages/. Nie jest to zawarte w domyślnej ścieżce (sys.path). Jak dodać ten katalog do ścieżki?

Ustawienie $PYTHONPATHzmiennej środowiskowej jest oczywiście rozwiązaniem, ale szukam bardziej eleganckiego sposobu na zrobienie tego. Na przykład easy_installumieszcza w nim również zainstalowane pakiety, moja sys.path wygląda mniej więcej tak:

['', '/usr/local/lib/python2.6/dist-packages/keyring-0.5.1-py2.6.egg', 
'/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk',  
'/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', 
'/usr/local/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages', 
'/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/pymodules/python2.6', 
'/usr/lib/pymodules/python2.6/gtk-2.0']

więc ścieżka nie jest oczywiście domyślną funkcją binarną Pythona.

Czy istnieje jeden plik konfiguracyjny zawierający powyższe wpisy? Lub w jaki sposób można go zmodyfikować?

Latanius
źródło

Odpowiedzi:

27

Dokumentacja modułu witryny i modyfikowanie ścieżki wyszukiwania Pythona wydaje się być tym, czego szukasz.

O ile rozumiem, te wpisy są dodawane sys.pathprzez:

  • /usr/lib/python2.6/site.py
  • /usr/lib/python2.6/dist-packages/site.py
    (Zmień 2.6 na swoją wersję Pythona).

Najłatwiej to zmienić, dodając plik /usr/local/lib/python2.6/dist-packages/site-packages.pthzawierający ../site-packages.

Ewentualnie możesz nauczyć pakiet obsługi site.getsitepackages()?

Mikel
źródło
1
dzięki, działa idealnie :) (Skończyło się na dodaniu pliku .pth do /usr/local/python2.6/dist-packages, zawierającego „../site-packages”)
Latanius
1
Możesz także utworzyć moduł o nazwie, sitecustomize.pyktóry site.pypróbuje tam importować i modyfikować sys.path.
TestUser16418,
5

Możesz utworzyć nowy plik o nazwie /etc/profile.d/local_python.shz zawartością

PYTHONPATH="/usr/local/lib/python2.6/site-packages/":"${PYTHONPATH}"
export PYTHONPATH

Co ustawi PYTHONPATHzmienną dla wszystkich zalogowanych użytkowników w twoim systemie.

TestUser16418
źródło
7
To naprawdę nie jest uniwersalne. Mechanizm /etc/profile.d będzie działał tylko dla powłok logowania dla osób z powłokami używającymi /etc/profile.d (bash / ksh / zsh). Jestem pewien, że użytkownicy csh nie zobaczą tej zmiany. Ponadto będą ignorowane w zadaniach cron / at.
Rich Homolka
2
jest to dobry sposób na ustawienie globalnych zmiennych środowiskowych (to kolejna rzecz, której nauczyłem się dzisiaj), ale jak wspomniałem w poście, szukałem bardziej Pythonicznego sposobu :)
Latanius
4

Chciałbym podsumować moje ustalenia dotyczące modyfikacji ścieżki Pythona. Można to zrobić na dwa sposoby.

  • plik .pth
  • PYTHONPATH

Każdy plik .pth , który znajduje się w domyślnej ścieżce (patrz poniżej), zostanie włączony do jego zawartości sys.path. Format wspomnianego pliku .pth jest prosty: jedna ścieżka (folderu) na wiersz. Co zaskakujące, ścieżki mogą być bezwzględne lub względne w stosunku do pliku .pth .

Domyślna ścieżka to miejsce, w którym przebywa tłumacz i <some-prefix>/lib/python<version>/site-packagesgdzie <some-prefix>zwykle /usr/.

PYTHONPATHjest zmienną środowiskową twojego systemu operacyjnego. W systemach uniksowych podajesz je według env. Globalna modyfikacja takich zmiennych odbywa się za pomocą skryptów .sh w /etc/profile.d/folderze, jak wspomniano w @ TestUser16418.

katomaso
źródło
2
To PYTHONPATH bez „_”
heroxbd
1

Na przykład, jeśli chcesz zaimportować sudsmoduł, który jest dostępny jako .eggplik:

egg_path = '/home/shahid/suds_2.4.egg'

sys.path.append(egg_path)

import suds
# ... rest of code
Mohammad Shahid Siddiqui
źródło