Встановити пакет Python в інший каталог за допомогою pip?


435

Я знаю, що очевидною відповіддю є використання virtualenv та virtualenvwrapper, але з різних причин я не можу / не хочу цього робити.

Отже, як я можу змінити команду

pip install package_name

змусити pipвстановити пакет де-небудь, крім замовчування site-packages?



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

2
@TomaszGandor Я думаю, що використання --ignore-installedпараметра повинно запобігти спробі видалення файлу вже встановлених пакетів.
Пьотр Доброгост

вибачте, що я новачок у pip, але ваше запитання те саме, що запитувати "як встановити pi для іншої версії python"? У мене є python 3.4 та 3.5, але я хочу, щоб мої установки на піп перейшли до python 3.5.
Чарлі Паркер

@Charlie Nope, інше питання. Я не знаю достатньо про вашу установку / наміри, але, як правило, я б, мабуть, використовував virtualenvwrapper і створив віртуальне середовище з чимось на зразокmkvirtualenv --python=/usr/bin/python3.5 env_name
Моніка Сулік

Відповіді:


334

Використання:

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

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


5
якщо ви це зробите, чи є спосіб перейти pip freezeдо альтернативного каталогу?
Russ

7
pip freeze виглядає на шляху, тому якщо вам щось подібне, PYTHONPATH=$PREFIX_PATH/lib/python2.6/site-packages pip freezeїх слід побачити.
Ian Bicking

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

1
@Piotr: так, я бачу мою відповідь. Використання '--prefix' є дещо грубим, але добре працює, якщо ви хочете, щоб ваш чистий пітон перейшов /usr/lib/pythonX.Y/site-packages замість /usr/local/lib/pythonX.Y/site- пакети.
Антон

80
Непогана відповідь 4 роки тому, але варіант - target існує вже зараз.
Tritium21

545

--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
@DanH біжи pip install --upgrade pip!
r3m0t

16
Це правдива відповідь, просто варіант був доданий зовсім трохи після прийнятої відповіді.
bukzor

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/isissue/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_PATH" не було.
32 біт

1
Питання Noobie, наскільки важливо /binстворює піп-папка, --userстворює його, як це робить, --PREFIXтоді як --targetні.
Джонатан

1
Якщо пакет встановлений у глобальному Python, --ignore-installedпотрібен.
Георгій Совєтов

1
Ця опція також сумісна з --editableлокальними встановленнями.
mdh

1
Ця опція зручна для встановлення пакунків як суперпользователя для іншого некорінного користувача без необхідності suнавколо (що може бути проблематичним, наприклад, у контейнерах).
mdh

43

Встановлення пакету Python часто включає лише чисті файли Python. Якщо пакет включає дані, сценарії та / або виконувані файли, вони встановлюються в різних каталогах із чистих файлів Python.

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

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)
Coliban

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/ evidencepackages]

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

Перевіряє залежності типу --prefix, але місце встановлення буде /myfolder/usr/local/lib/python3.5/site-packages/ evidencepackage_name].

pip install --користувач [пакети]

Встановлювати пакети в $ HOME: /home/ evidenceUSERERT/.local/lib/python3.5/site-packages Python автоматично здійснює пошук із цього .local шляху, тому вам не потрібно ставити його у свій PYTHONPATH.

=> У більшості випадків - користувач - найкращий варіант використання. У випадку, якщо домашню папку неможливо використовувати через певні причини, тоді - виправлення.


Запуск під 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каталог. Я створив там каталог "бін" і встановив директиви для 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.

Я думав, що включу це у випадку, якщо у когось іншого є подібні проблеми на машині, до якої вони не мають доступу до судо.


2

Якщо ви використовуєте brew з python, на жаль, Pip / pip3 постачається з дуже обмеженими можливостями. У вас немає варіантів --install, --target, --user, як було зазначено вище.

Примітка про встановлення pip --користувача
Звичайна установка 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

За іронією долі ви насправді знижуєтесь функціональність пипсов.

(Я публікую цю відповідь, просто тому, що в моєму 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

Повний робочий вміст конф-файлу:

[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/

зараз це можливо.

Різниця з цим та використанням прапорця -eабо --editableпрапорця полягає в тому-e посилання на збереження пакету (тобто папку для завантаження), а не встановлення його у ваш шлях python.

Це означає, що якщо ви видалите / перемістите пакет до іншої папки, ви не зможете ним скористатися.


це не відповідає на питання
Клінтм

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.