Установить пакет Python в другой каталог, используя pip?


435

Я знаю, что очевидный ответ - использовать virtualenv и virtualenvwrapper, но по разным причинам я не могу / не хочу этого делать.

Так как мне изменить команду

pip install package_name

сделать pipустановку пакета где-нибудь, кроме по умолчанию site-packages?



2
Теперь вопрос номер два: когда вы уже устанавливаете в пользовательский каталог, как pipне пытаться удалить старую версию из нестандартного каталога. Например - общесистемный, где у вас нет прав на запись. До сих пор я справлялся только с easy_install...
Томаш Гандор

2
@TomaszGandor Я думаю, что использование --ignore-installedопции должно предотвратить попытки pip удалить уже установленные пакеты.
Петр Доброгост

извините, я новичок в pip, но ваш вопрос такой же, как вопрос "как установить pi на другую версию python"? У меня есть Python 3.4 и 3.5, но я хочу, чтобы мои установки pip перешли на python 3.5.
Чарли Паркер

@ Чарли Нет, другой вопрос. Я не знаю достаточно о вашей установке / намерениях, но в целом я бы, вероятно, использовал virtualenvwrapper и создал бы виртуальную среду с чем-то вродеmkvirtualenv --python=/usr/bin/python3.5 env_name
Monika

Ответы:


335

Использование:

pip install --install-option="--prefix=$PREFIX_PATH" package_name

Вы также можете использовать --ignore-installedдля принудительной переустановки всех зависимостей, используя этот новый префикс. Вы можете использовать --install-optionнесколько раз, чтобы добавить любую из опций, с которыми вы можете работать python setup.py install( --prefixвозможно, это то, что вы хотите, но есть куча других опций, которые вы можете использовать).


5
Если вы сделаете это, есть ли способ получить pip freezeальтернативный каталог?
Расс

7
pip freeze смотрит на дорожку, поэтому если вам что-то нравится, PYTHONPATH=$PREFIX_PATH/lib/python2.6/site-packages pip freezeто стоит их увидеть.
Ян Биккинг

4
Использование --prefix=$PREFIX_PATH, похоже, не дает полного контроля над установочным каталогом, так как к нему добавляется суффикс, специфичный для системы ( \Lib\site-packagesнапример, в Windows). Есть ли способ указать конкретный каталог?
Петр Доброгост

1
@ Петр: да, вот мой ответ. Использование '--prefix' немного грубовато, но хорошо работает, если вы хотите, чтобы ваш чистый питон шел в /usr/lib/pythonX.Y/site-packages вместо /usr/local/lib/pythonX.Y/site- пакеты.
Anthon

80
Неплохой ответ 4 года назад, но опция --target существует и сейчас.
Тритий21,

546

--Target выключатель является , что вы ищете:

pip install --target=d:\somewhere\other\than\the\default package_name

Но вам все еще нужно добавить, d:\somewhere\other\than\the\defaultчтобы PYTHONPATHиспользовать их из этого места.

-t, --target <dir>
Установить пакеты в <dir>. По умолчанию это не заменит существующие файлы / папки в <dir>.
Используйте --upgrade для замены существующих пакетов в <dir> новыми версиями.


Обновите пункт, если целевой переключатель недоступен:

В Linux или OS X:

pip install -U pip

В Windows (это решает проблему ):

python -m pip install -U pip

8
@ Беги pip install --upgrade pip!
r3m0t

16
Это верный ответ, просто опция была добавлена ​​совсем немного после принятого ответа.
Букзор

5
Какая разница между --install-option="--prefix=$PREFIX_PATH"упомянутым @Ian Bicking и --target=$PATHопцией?
Hibou57

6
targetэто пункт, и все, что вы вставите, install-optionбудет передано setup.py install command. В основном это targetрасположение пользовательских сайтов-пакетов.
Януш Сконечны

10
Использование --targetможет привести к частичной установке, так как он не будет устанавливать никакие файлы сценариев / данных, включая указанный префикс. Кажется, что передача --prefixс --install-option- это единственный правильный способ получить полный контроль над префиксом используемых установок.
Кеннет Хосте

74

Вместо --targetопции или --install-optionsопции я обнаружил, что следующее работает хорошо (из обсуждения ошибки относительно этой самой вещи на https://github.com/pypa/pip/issues/446 ):

PYTHONUSERBASE=/path/to/install/to pip install --user

(Или установите PYTHONUSERBASEкаталог в вашей среде перед запуском команды, используя export PYTHONUSERBASE=/path/to/install/to)

При этом используется очень полезный --userвариант , но говорит это сделать bin, lib, shareи другие каталоги , которые вы ожидали бы под настраиваемой приставкой , а не$HOME/.local .

Затем вы можете добавить это в ваших PATH, PYTHONPATHи других переменных , как вы нормальный каталог установки.

Обратите внимание, что вам также может потребоваться указать параметры --upgradeи --ignore-installed, если для любых пакетов, от которых это зависит, требуется установить более новые версии в PYTHONUSERBASEкаталоге, чтобы переопределить предоставленные системой версии.

Полный пример:

PYTHONUSERBASE=/opt/mysterypackage-1.0/python-deps pip install --user --upgrade numpy scipy

... чтобы установить scipyи numpyупаковать самые последние версии в каталог, который вы затем можете включить в свой каталог PYTHONPATH(например, для bash и для python 2.6 в CentOS 6 для этого примера):

export PYTHONPATH=/opt/mysterypackage-1.0/python-deps/lib64/python2.6/site-packages:$PYTHONPATH
export PATH=/opt/mysterypackage-1.0/python-deps/bin:$PATH

Использование virtualenv - все еще лучшее и более аккуратное решение!


4
Это работало с Travis CI, работающим на контейнерах Docker, тогда как решение --install-option = "- prefix = $ PREFIX_PATH" этого не делало.
32 бит

1
Вопрос Noobie, насколько важна /binпапка, которую --userсоздает pip, создает ее, как делает, --PREFIXтогда как --targetнет.
Джонатан

1
Если пакет установлен в глобальном Python, --ignore-installedнеобходимо.
Георгий Советов

1
Эта опция также совместима с --editableлокальной установкой.
17

1
Эта опция удобна для установки пакетов как суперпользователя для другого пользователя без полномочий root без необходимости suобхода (например, это может быть проблематично в контейнерах).
17

43

Установка пакета Python часто включает только некоторые чистые файлы Python. Если пакет содержит данные, сценарии и / или исполняемые файлы, они устанавливаются в разные каталоги из чистых файлов Python.

Предполагая, что в вашем пакете нет данных / скриптов / исполняемых файлов, и что вы хотите, чтобы ваши файлы Python помещались /python/packages/package_name(а не в какой-то подкаталог на несколько уровней ниже, /python/packagesкак при использовании --prefix), вы можете использовать команду time:

pip install --install-option="--install-purelib=/python/packages" package_name

Если вы хотите, чтобы все (или большинство) ваших пакетов были там, вы можете отредактировать свой, ~/.pip/pip.confвключив в него:

[install]
install-option=--install-purelib=/python/packages

Таким образом, вы не можете забыть о необходимости указывать это снова и снова.

Любые исключаемые файлы / данные / сценарии, включенные в пакет, будут по-прежнему отправляться в места по умолчанию, если вы не укажете дополнительные параметры установки ( --prefix/ --install-data/ --install-scriptsи т. Д., Для получения подробной информации смотрите пользовательские параметры установки ).


1
Большой плюс для конфигурационного файла. Я лично указал --prefixтам, потому что у меня есть «локальный» каталог на общем сервере в домашнем каталоге, и он использовался в качестве префикса easy_installдо того, как я перешел на pip. Система $PATHи $PYTHONPATHбыли настроены ранее. Вместо этого install-option=--install-purelib=/blahесть более новая target=/blahопция / переключатель. Это также хорошо, но иногда вам нужна просто замена --prefix, которую вы бы использовали с setup.pyили easy_install.
Томаш Гандор

30

Чтобы установить библиотеку точно там, где я хотел, я перешел в то место, где я хотел, каталог с терминалом, а затем использовал

pip install mylibraryName -t . 

логика, которую я взял с этой страницы: https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/download


11
-tявляется сокращением для--target
Джонатан

Это было единственное решение, которое сработало для меня. (Windows 7)
Колибан

18

Никто, кажется, не упомянул опцию -t, но это самое простое:

pip install -t <direct directory> <package>

8
-tВариантом является короткой версией --targetопции , которая была описана в другом ответ ( stackoverflow.com/a/19404371/594053 ) :)
MattiSG

14

Просто добавьте одно очко к ответу @Ian Bicking:

С использованием --user опции для указания установленного каталога также работает, если вы хотите установить некоторый пакет Python в свой домашний каталог (без права пользователя sudo) на удаленном сервере.

Например,

pip install --user python-memcached

Команда установит пакет в один из каталогов, перечисленных в вашей PYTHONPATH.


14

Протестировал эти опции с python3.5 и pip 9.0.3:

pip install --target / myfolder [пакеты]

Устанавливает ВСЕ пакеты, включая зависимости в / myfolder. Не учитывает, что зависимые пакеты уже установлены в других местах Python. Вы найдете пакеты из / myfolder / [имя_пакета]. Если у вас есть несколько версий Python, это не учитывается (версия Python в имени папки пакета отсутствует).

pip install --prefix / myfolder [пакеты]

Проверки - это уже установленные зависимости. Установит пакеты в /myfolder/lib/python3.5/site-packages/[packages]

pip install --root / myfolder [пакеты]

Проверяет зависимости, такие как --prefix, но место установки будет /myfolder/usr/local/lib/python3.5/site-packages/[package_name].

pip install --user [пакеты]

Будут установлены пакеты в $ HOME: /home/[USER]/.local/lib/python3.5/site-packages. Python автоматически выполняет поиск по этому пути .local, поэтому вам не нужно помещать его в PYTHONPATH.

=> В большинстве случаев --user - лучший вариант для использования. Если домашняя папка не может быть использована по какой-либо причине, тогда --prefix.


Работая под python 2.7.16, --target (или --prefix) устанавливает, например, Jinja2-2.10.1.dist-info /, тогда как install --install-option = "- префикс устанавливает Jinja2-2.10.1-py2 .7.egg-info /, это то, что я на самом деле хотел
Грег Догерти

13

Более новые версии pip(8 или более поздние) могут напрямую использовать --prefixпараметр :

pip install --prefix=$PREFIX_PATH package_name

где $PREFIX_PATHпрефикс установки, куда помещаются lib, bin и другие папки верхнего уровня.



4

В дополнение к уже хорошему совету, так как у меня была проблема с установкой IPython, когда у меня не было прав на запись в/usr/local .

pip использует distutils для своей установки, и этот поток обсуждает, как это может вызвать проблему, поскольку он полагается наsys.prefix настроек.

Моя проблема произошла, когда установка IPython пыталась записать в '/ usr / local / share / man / man1' с отказом в разрешении . Поскольку установка не удалась, похоже, что файлы IPython не записывались в каталог bin.

Использование «--user» сработало, и файлы были записаны в ~ / .local. Добавление ~ / .local / bin в $ PATH означало, что я мог бы использовать "ipython" оттуда.

Однако я пытаюсь установить это для ряда пользователей и получил разрешение на запись в /usr/local/lib/python2.7каталог. Я создал каталог bin там и установил директивы для distutils:

vim ~/.pydistutils.cfg

[install]
install-data=/usr/local/lib/python2.7
install-scripts=/usr/local/lib/python2.7/bin

затем ( -Iиспользуется для принудительной установки, несмотря на предыдущие сбои / .local install):

pip install -I ipython

Затем я добавил /usr/local/lib/python2.7/binв $PATH.

Я думал, что включу это в случае, если у кого-то еще есть подобные проблемы на машине, к которой у них нет доступа sudo.


2

Если вы используете brew с python, к сожалению, pip / pip3 поставляется с очень ограниченными возможностями. У вас нет опций --install-option, --target, --user, как указано выше.

Замечание по установке pip --user
Обычная установка pip --user отключена для готового Python. Это из-за ошибки в distutils, потому что Homebrew пишет distutils.cfg, который устанавливает префикс пакета. Возможный обходной путь (который помещает исполняемые скрипты в ~ / Library / Python /./ bin): python -m pip install --user --install-option="--prefix=" <package-name>

Вы можете найти эту строку очень громоздкой. Я предлагаю использовать pyenv для управления. Если вы используете

brew upgrade python python3

Как ни странно , вы фактически понижаем функциональность пипсов.

(Я публикую этот ответ просто потому, что pip в моем Mac OSX не имеет опции --target, и я потратил часы на ее исправление)


Этот ответ с явным префиксом и ignore-installedблагодаря предыдущим усилиям работал на меня:python -m pip install --user --install-option="--prefix='/myFunkyApp/lib'" --ignore-installed <package-name>
Джереми Джонс

0

С pip v1.5.6на Python v2.7.3(GNU / Linux) опция --rootпозволяет указать глобальный префикс установки (по-видимому) независимо от параметров конкретного пакета. Попробуй фи,

$ pip install --root=/alternative/prefix/path package_name

0

Я предлагаю следовать документации и создать файл ~ / .pip / pip.conf. Обратите внимание, что в документации отсутствует указанная директория заголовка, что приводит к следующей ошибке:

error: install-base or install-platbase supplied, but installation scheme is incomplete

Полный рабочий контент файла conf:

[install]
install-base=$HOME
install-purelib=python/lib
install-platlib=python/lib.$PLAT
install-scripts=python/scripts
install-headers=python/include
install-data=python/data

К сожалению, я могу установить, но при попытке удалить pip сообщает, что такого пакета для процесса удаления не существует .... поэтому что-то все равно не так, но пакет идет в предопределенное место.


0

pip install /path/to/package/

теперь возможно.

Разница с этим и использование флага -eor --editableзаключается в том -e, что вместо того, чтобы устанавливать его в путь к python, вы указываете, куда был сохранен пакет (т. Е. Ваша папка загрузок).

Это означает, что если вы удалите / переместите пакет в другую папку, вы не сможете его использовать.


это не отвечает на вопрос
Клинт

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.