Как глобально изменить стандартную PYTHONPATH (sys.path)?

33

В системе Ubuntu (10.10) у меня есть пакет Python, который устанавливает себя в /usr/local/lib/python2.6/site-packages/. Это не содержится в пути по умолчанию (sys.path). Как добавить этот каталог в путь?

$PYTHONPATHКонечно, установка переменной среды - это решение, но я ищу более элегантный способ сделать это. Например, easy_installтакже помещает в него установленные пакеты, мой sys.path выглядит примерно так:

['', '/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']

таким образом, путь явно не по умолчанию встроен в двоичный файл Python.

Есть ли один файл конфигурации, который содержит записи выше? Или каким образом это можно изменить?

Latanius
источник

Ответы:

27

Документация по модулю сайта и изменение пути поиска Python - это то, что вам нужно.

Насколько я понимаю, эти записи добавляются sys.path:

  • /usr/lib/python2.6/site.py
  • /usr/lib/python2.6/dist-packages/site.py
    (Измените 2.6 на вашу версию Python.)

Самый простой способ изменить это - добавить файл, /usr/local/lib/python2.6/dist-packages/site-packages.pthсодержащий ../site-packages.

В качестве альтернативы, может быть, вы можете научить пакет использовать site.getsitepackages()?

Mikel
источник
1
спасибо, отлично работает :) (в итоге я добавил .pth файл в /usr/local/python2.6/dist-packages, содержащий "../site-packages")
Latanius
1
Вы также можете создать модуль с именем, sitecustomize.pyкоторый site.pyпытается импортировать и изменять sys.pathтам.
TestUser16418
5

Вы можете создать новый файл /etc/profile.d/local_python.shс содержимым

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

Который будет устанавливать PYTHONPATHпеременную для всех зарегистрированных пользователей в вашей системе.

TestUser16418
источник
7
Это действительно не универсально. Механизм /etc/profile.d будет работать только для оболочек входа в систему для людей с оболочками, которые используют /etc/profile.d (bash / ksh / zsh). Я уверен, что пользователи csh не увидят этого изменения. Также будет игнорироваться в cron / at jobs.
Богатая Гомолка
2
это хороший способ установить глобальные переменные среды (еще одна вещь, которую я узнал сегодня), но, как я упоминал в посте, я искал более Pythonic способ :)
Latanius
4

Я хотел бы обобщить мои выводы о модификации пути в Python. Есть два способа сделать это.

  • .pth файл
  • PYTHONPATH

Любой файл .pth, который находится по пути по умолчанию (см. Ниже), будет включен в его содержимое sys.path. Формат указанного .pth файла прост: один (папка) путь на строку. Удивительно, но пути могут быть абсолютными или относительными к файлу .pth .

Путь по умолчанию - это место, где находится переводчик, и <some-prefix>/lib/python<version>/site-packagesгде <some-prefix>обычно /usr/.

PYTHONPATHявляется переменной среды вашей операционной системы. В системах Unix вы перечисляете их по env. Глобальная модификация таких переменных выполняется с помощью скриптов .sh внутри /etc/profile.d/папки, как указано в @ TestUser16418.

katomaso
источник
2
Это PYTHONPATH без "_"
heroxbd
1

Например, если вы хотите импортировать sudsмодуль, который доступен в виде .eggфайла:

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

sys.path.append(egg_path)

import suds
# ... rest of code
Мохаммад Шахид Сиддики
источник