Czy zainstalować pakiet Python w innym katalogu przy użyciu pip?

434

Wiem, że oczywistą odpowiedzią jest użycie virtualenv i virtualenvwrapper, ale z różnych powodów nie mogę / nie chcę tego robić.

Jak więc zmodyfikować polecenie

pip install package_name

zrobić pipinstalację pakietu w innym miejscu niż domyślny site-packages?

Monika Sulik
źródło
2
Teraz pytanie drugie: kiedy już instalujesz w katalogu niestandardowym, jak pipNIE próbować usuwać starszej wersji z katalogu niestandardowego. Na przykład - systemowy, w którym nie masz uprawnień do zapisu. Do tej pory robiłem to tylko z easy_install...
Tomasz Gandor,
2
@TomaszGandor Myślę, że użycie --ignore-installedopcji powinno uniemożliwić pipowi próbę odinstalowania już zainstalowanych pakietów.
Piotr Dobrogost
przepraszam, jestem nowy w pipie, ale czy twoje pytanie jest takie samo, jak pytanie „jak zainstalować program pi w innej wersji Pythona”? Mam Python 3.4 i 3.5, ale chcę, aby moje instalacje PIP przechodziły do ​​Pythona 3.5.
Charlie Parker,
@Charlie Nope, inne pytanie. Nie wiem wystarczająco o twojej instalacji / zamiarach, ale generalnie prawdopodobnie użyłbym virtualenvwrapper i stworzyłbym wirtualne środowisko z czymś takimmkvirtualenv --python=/usr/bin/python3.5 env_name
Monika Sulik

Odpowiedzi:

334

Posługiwać się:

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

Możesz także użyć tej opcji --ignore-installeddo wymuszenia ponownej instalacji wszystkich zależności przy użyciu tego nowego prefiksu. Możesz użyć --install-optionwielokrotnie, aby dodać dowolną opcję, której możesz użyć python setup.py install( --prefixprawdopodobnie jest to, czego chcesz, ale jest jeszcze kilka opcji, których możesz użyć).

Ian Bicking
źródło
5
jeśli to zrobisz, czy jest sposób, pip freezeaby zobaczyć alternatywny katalog?
Russ
7
PIP Freeze patrzy na ścieżkę, więc jeśli coś takiego PYTHONPATH=$PREFIX_PATH/lib/python2.6/site-packages pip freezepowinno to zobaczyć.
Ian Bicking,
4
--prefix=$PREFIX_PATHWydaje się, że używanie nie pozwala na pełną kontrolę nad katalogiem instalacyjnym, ponieważ dołączany jest do niego przyrostek specyficzny dla systemu ( \Lib\site-packagesna przykład w systemie Windows). Czy istnieje sposób na określenie konkretnego katalogu?
Piotr Dobrogost
1
@Piotr: tak, widzę moją odpowiedź. Użycie „--prefix” jest nieco zgrubne, ale działa dobrze, jeśli chcesz, aby czysty Python działał pod /usr/lib/pythonX.Y/site-packages zamiast /usr/local/lib/pythonX.Y/site- paczki
Anthon
80
Niezła odpowiedź 4 lata temu, ale opcja --target istnieje teraz.
Tritium21
545

--Target przełącznik jest rzeczą szukasz:

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

Ale trzeba jeszcze dodać d:\somewhere\other\than\the\defaultdo PYTHONPATHrzeczywiście z nich korzystać z tej lokalizacji.

-t, --target <katalog>
Instaluj pakiety w <katalog>. Domyślnie nie zastąpi to istniejących plików / folderów w <katalog>.
Użyj --upgrade, aby zastąpić istniejące pakiety w <katalog> nowymi wersjami.


Zaktualizuj pip, jeśli przełącznik docelowy nie jest dostępny:

W systemie Linux lub OS X:

pip install -U pip

W systemie Windows (działa to w przypadku problemu ):

python -m pip install -U pip
Janusz Skonieczny
źródło
8
@DanH run pip install --upgrade pip!
r3m0t
16
To jest prawdziwa odpowiedź, po prostu opcja została dodana nieco po zaakceptowanej odpowiedzi.
bukzor
5
Jaka jest różnica między --install-option="--prefix=$PREFIX_PATH"wspomnianym przez @Ian Bicking a --target=$PATHopcją?
Hibou57
6
targetjest opcją pip, a wszystko, co wpiszesz, install-optionzostanie przekazane do setup.py install command. Zasadniczo targetjest to lokalizacja niestandardowych pakietów witryn.
Janusz Skonieczny
10
Użycie --targetmoże spowodować częściową instalację, ponieważ nie spowoduje instalacji żadnych skryptów / plików danych w określonym prefiksie. Wydaje się, przechodząc --prefixze --install-optionjest to jedyny właściwy sposób, aby mieć pełną kontrolę nad zużytą instalacji prefiks.
Kenneth Hoste
73

Zamiast --targetopcji lub --install-optionsopcji okazało się, że następujące działa dobrze (z dyskusji na temat błędu dotyczącego tej właśnie rzeczy na https://github.com/pypa/pip/issues/446 ):

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

(Lub ustaw PYTHONUSERBASEkatalog w swoim środowisku przed uruchomieniem polecenia, używając export PYTHONUSERBASE=/path/to/install/to)

Używa bardzo przydatnych --useropcji, ale mówi, że należy wprowadzić bin, lib, sharei inne katalogi można oczekiwać pod niestandardowym zamiast prefiksu $HOME/.local.

Następnie można dodać do tego PATH, PYTHONPATHi innych zmiennych, tak jak normalny katalog instalacyjny.

Pamiętaj, że może być konieczne określenie opcji --upgradei, --ignore-installedjeśli jakiekolwiek pakiety, od których to zależy, wymagają zainstalowania nowszych wersji w PYTHONUSERBASEkatalogu, aby zastąpić wersje dostarczone przez system.

Pełny przykład:

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

.. aby zainstalować scipyi numpyspakować najnowsze wersje do katalogu, który możesz następnie dołączyć do swojego PYTHONPATHpodobnego (używając bash i dla Pythona 2.6 na CentOS 6 w tym przykładzie):

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

Korzystanie z virtualenv jest wciąż lepszym i schludniejszym rozwiązaniem!

David Gardner
źródło
4
Działa to z Travis CI działającym na kontenerach Docker, podczas gdy rozwiązanie --install-option = "- prefix = $ PREFIX_PATH" nie.
32 bitów,
1
Pytanie Noobie, jak ważny jest /binfolder, który tworzy pip, --usertworzy go tak, jak robi, --PREFIXa --targetnie robi.
Jonathan
1
Jeśli pakiet jest zainstalowany w globalnym Pythonie, --ignore-installedjest potrzebny.
George Sovetov,
1
Ta opcja jest również kompatybilna z --editablelokalnymi instalacjami.
mdh
1
Ta opcja jest przydatna do instalowania pakietów jako superużytkownik dla innego użytkownika innego niż root bez konieczności korzystania z suniego (co może być problematyczne na przykład w kontenerach).
mdh
43

Instalowanie pakietu Python często obejmuje tylko niektóre czyste pliki Pythona. Jeśli pakiet zawiera dane, skrypty i / lub pliki wykonywalne, są one instalowane w różnych katalogach niż pliki czystego języka Python.

Zakładając, że twój pakiet nie ma danych / skryptów / plików wykonywalnych i że chcesz, aby twoje pliki Pythona były przenoszone /python/packages/package_name(a nie niektóre podkatalogi kilka poziomów poniżej /python/packagesjak podczas korzystania --prefix), możesz użyć polecenia jednorazowego:

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

Jeśli chcesz, aby wszystkie (lub większość) pakietów tam ~/.pip/pip.confsię znalazło , możesz je edytować, aby uwzględnić:

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

W ten sposób nie możesz zapomnieć o konieczności powtarzania tego.

Wszelkie pliki excecutables / data / scripts zawarte w pakiecie nadal będą znajdować się w domyślnych miejscach, chyba że określisz dodatkowe opcje instalacji ( --prefix/ --install-data/ --install-scriptsitp., Aby poznać szczegóły, patrz opcje instalacji niestandardowej ).

Anthon
źródło
1
Duży plus za plik konfiguracyjny. Podaję --prefixtam osobiście , ponieważ mam katalog „lokalny” na wspólnym serwerze w katalogu domowym i był on używany jako prefiks easy_installprzed przejściem do pip. System $PATHi $PYTHONPATHzostały wcześniej skonfigurowane. Zamiast tego install-option=--install-purelib=/blahjest ta nowsza target=/blahopcja / przełącznik. Jest to również miłe, ale czasami potrzebujesz tylko zamiennika --prefix, którego możesz użyć z setup.pylub easy_install.
Tomasz Gandor,
18

Wydaje się, że nikt nie wspomniał o opcji -t, ale jest to najłatwiejsze:

pip install -t <direct directory> <package>
Erwan
źródło
8
-tOpcja jest krótka wersja --targetwariantu, który został opisany w innym Odpowiedź ( stackoverflow.com/a/19404371/594053 ) :)
MattiSG
14

Wystarczy dodać jeden punkt do odpowiedzi @Ian Bicking:

Korzystanie z --useropcji określania zainstalowanego katalogu działa również, jeśli chce się zainstalować pakiet Pythona w swoim katalogu domowym (bez prawa użytkownika sudo) na zdalnym serwerze.

Na przykład,

pip install --user python-memcached

Polecenie zainstaluje pakiet w jednym z katalogów wymienionych w ścieżce PYTHONPATH.

Życzliwość
źródło
14

Testowałem te opcje z python3.5 i pip 9.0.3:

pip install --target / myfolder [pakiety]

Instaluje WSZYSTKIE pakiety, w tym zależności w / myfolder. Nie bierze pod uwagę, że pakiety zależne są już zainstalowane gdzie indziej w Pythonie. Znajdziesz pakiety z / myfolder / [nazwa_pakietu]. Jeśli masz wiele wersji Pythona, nie bierze to pod uwagę (brak wersji Pythona w nazwie folderu pakietu).

pip install --prefix / myfolder [pakiety]

Czeki to już zainstalowane zależności. Zainstaluje pakiety w /myfolder/lib/python3.5/site-packages/[packages]

pip install --root / myfolder [pakiety]

Sprawdza zależności, takie jak --prefix, ale lokalizacją instalacji będzie /myfolder/usr/local/lib/python3.5/site-packages/[package_name].

pip install --user [pakiety]

Zainstaluje pakiety w $ HOME: /home/[USER]/.local/lib/python3.5/site-packages Python automatycznie wyszukuje z tej ścieżki .local, więc nie musisz umieszczać go w PYTHONPATH.

=> W większości przypadków najlepszym wyborem jest użytkownik. W przypadku, gdy z jakiegoś powodu nie można użyć folderu domowego, należy - przedrostek.

Mikko
źródło
Działa w Pythonie 2.7.16, --target (lub --prefix) instaluje na przykład Jinja2-2.10.1.dist-info /, natomiast install --install-option = "- prefiks instaluje Jinja2-2.10.1-py2 .7.egg-info /, a tego właśnie chciałem
Greg Dougherty,
13

Nowsze wersje pip(8 lub nowsze) mogą bezpośrednio korzystać z --prefixopcji :

pip install --prefix=$PREFIX_PATH package_name

gdzie $PREFIX_PATHjest prefiksem instalacji, w którym znajdują się lib, bin i inne foldery najwyższego poziomu.

Mike T.
źródło
10
pip install packageName -t pathOfDirectory

lub

pip install packageName --target pathOfDirectorty
kundan kaushik
źródło
4

Aby dodać do i tak dobrej porady, ponieważ miałem problem z instalacją IPython, gdy nie miałem uprawnień do zapisu /usr/local.

pip używa distutils do instalacji, a ten wątek omawia, w jaki sposób może to powodować problem, ponieważ zależy od tego sys.prefixustawienia.

Mój problem wystąpił, gdy instalacja IPython próbowała pisać do „/ usr / local / share / man / man1” z odmową zezwolenia . Ponieważ instalacja się nie powiodła, wydawało się, że nie zapisuje plików IPython w katalogu bin.

Używanie „--user” działało, a pliki były zapisywane w ~ / .local. Dodanie ~ / .local / bin do $ PATH oznaczało, że mogłem użyć „ipython”.

Jednak próbuję zainstalować to dla wielu użytkowników i otrzymałem uprawnienia do zapisu w /usr/local/lib/python2.7katalogu. Utworzyłem tam katalog „bin” i ustawiłem dyrektywy dla distutils:

vim ~/.pydistutils.cfg

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

następnie ( -Isłuży do wymuszenia instalacji pomimo poprzednich awarii / instalacji lokalnej):

pip install -I ipython

Potem dodałem /usr/local/lib/python2.7/bindo $PATH.

Pomyślałem, że dołączę to na wypadek, gdyby ktoś miał podobne problemy na komputerze, do którego nie ma dostępu sudo.

Stuart Brock
źródło
2

Jeśli używasz naparu z pytonem, niestety pip / pip3 jest dostarczany z bardzo ograniczonymi opcjami. Nie masz opcji --install-option, --target, --user, jak wspomniano powyżej.

Uwaga na temat pip install --user
Normalny użytkownik pip install --user jest wyłączony dla warzonego Pythona. Wynika to z błędu w distutils, ponieważ Homebrew zapisuje plik distutils.cfg, który ustawia prefiks pakietu. Możliwe obejście (które umieszcza skrypty wykonywalne w ~ / Library / Python /./ bin) to: python -m pip install --user --install-option="--prefix=" <package-name>

Może się okazać, że ta linia jest bardzo niewygodna. Sugeruję używać pyenv do zarządzania. Jeśli używasz

brew upgrade python python3

Ironicznie jesteś rzeczywiście obniżyć funkcjonalność PIP.

(Publikuję tę odpowiedź, po prostu dlatego, że pip w moim Mac OSX nie ma opcji --target i spędziłem godziny na jej poprawianiu)

anonimowy
źródło
Ta odpowiedź z wyraźnym prefiksem, a także z ignore-installedpowodu poprzednich wysiłków, zadziałała dla mnie:python -m pip install --user --install-option="--prefix='/myFunkyApp/lib'" --ignore-installed <package-name>
Jeremy Jones
0

Z pipem v1.5.6w Pythonie v2.7.3(GNU / Linux) opcja --rootpozwala określić globalny prefiks instalacji (najwyraźniej) niezależnie od opcji konkretnego pakietu. Wypróbuj fi,

$ pip install --root=/alternative/prefix/path package_name
sphakka
źródło
0

Proponuję postępować zgodnie z dokumentacją i utworzyć plik ~ / .pip / pip.conf. Uwaga: w dokumentacji brakuje określonego katalogu nagłówka, co prowadzi do następującego błędu:

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

Pełna robocza zawartość pliku conf to:

[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

Niestety mogę zainstalować, ale kiedy próbuję odinstalować, pip mówi mi, że nie ma takiego pakietu do odinstalowania ... więc coś jest nadal nie tak, ale pakiet trafia do wcześniej zdefiniowanej lokalizacji.

kensai
źródło
0

pip install /path/to/package/

jest teraz możliwe.

Różnica polega na tym, że użycie flagi -elub --editablepolega na tym, że -elinki do miejsca, w którym pakiet jest zapisany (tj. Folder pobranych plików), zamiast instalowania go na ścieżce Pythona.

Oznacza to, że jeśli usuniesz / przeniesiesz pakiet do innego folderu, nie będziesz mógł go używać.

AH
źródło
to nie odpowiada na pytanie
Clintm