Какой стандартный способ установки модулей из стандартной библиотеки Python в локальный каталог? - PullRequest
2 голосов
/ 26 марта 2012

Я обнаружил, что администратор сервера, который я использую, имеет тенденцию оставлять модули python крайне устаревшими, и у меня нет времени ждать, пока этот человек обновит глобальные каталоги.

Можно ли как-нибудь, чтобы мои локальные модули Python имели приоритет над глобальными библиотеками без изменения вручную sys.path?

1 Ответ

4 голосов
/ 26 марта 2012

Существуют различные варианты. Если вы используете Python 2.6 или новее, вы можете установить модули Python в свой домашний каталог, используя схему установки пользователя , поддерживаемую дистрибутивами Python. Просто добавьте --user к команде setup.py install, как описано в ссылке. Другой популярный вариант - использовать сторонний пакет virtualenv для создания одной или нескольких изолированных локальных сред Python.

ОБНОВЛЕНИЕ: Для user installation scheme проверка на наличие каталога пользовательских пакетов сайта выполняется во время запуска Python. Если каталог существует, он добавляется в sys.path до системного каталога site-packages. Например, при установке Debian Linux:

$ python2.7 -c 'import site; print(site.USER_SITE)'
/home/nad/.local/lib/python2.7/site-packages
$ ls -l /home/nad/.local/lib/python2.7/site-packages
ls: cannot access /home/nad/.local/lib/python2.7/site-packages: No such file or directory
$ python2.7 -c 'import sys; print(sys.path)'
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7']
# user site-packages dir doesn't exist so it's not in sys.path
$ mkdir -p ~/.local/lib/python2.7/site-packages
$ python2.7 -c 'import sys; print(sys.path)'
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/home/nad/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7']
# now user site-packages dir exists so it is in sys.path and before /usr/lib ones
...