Python paketi pip kullanarak farklı bir dizine kurulsun mu?


435

Açık cevabın virtualenv ve virtualenvwrapper kullanmak olduğunu biliyorum, ancak çeşitli nedenlerle bunu yapmak istemiyorum / istemiyorum.

Peki komutu nasıl değiştiririm

pip install package_name

yapmak için pipvarsayılan dışında paket bir yere yüklemek site-packages?



2
Şimdi ikinci soru: Zaten özel bir dizine yüklediğinizde, özel pipolmayan bir dizinden eski sürümü kaldırmayı denemeyin. Örneğin - yazma izninizin olmadığı sistem genelinde. Şimdiye kadar bunu sadece easy_install
şununla çıkardım

2
@TomaszGandor Bence --ignore-installedseçeneği kullanmak pip zaten yüklü paketleri kaldırmaya çalışmasını engellemelidir.
Piotr Dobrogost

Üzgünüm pip ile yeniyim, ama sorunuz "pi piton farklı bir sürümüne nasıl kurulur" sorma aynı mı? Python 3.4 ve 3.5 var ama pip kurulumlarımı python 3.5 gitmek istiyorum.
Charlie Parker

@Charlie Nope, farklı bir soru. Kurulumunuz / niyetleriniz hakkında yeterince bilgim yok, ancak genellikle sanalenvwrapper'ı kullanır ve benzer bir şeyle sanal bir ortam yaratırımmkvirtualenv --python=/usr/bin/python3.5 env_name
Monika Sulik

Yanıtlar:


334

kullanın:

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

Ayrıca, --ignore-installedtüm bağımlılıkları bu yeni önek kullanılarak yeniden yüklenmeye zorlamak için de kullanmak isteyebilirsiniz . Kullanabileceğiniz --install-optionseçeneklerden herhangi birini eklemek için birden çok kez kullanabilirsiniz python setup.py install( --prefixmuhtemelen istediğiniz şeydir, ancak kullanabileceğiniz çok daha fazla seçenek vardır).


5
bunu yaparsanız pip freeze, alternatif dizini görmek için bir yolu var mı?
Russ

7
pip donma yol üzerinde görünüyor, bu yüzden eğer böyle bir şey PYTHONPATH=$PREFIX_PATH/lib/python2.6/site-packages pip freezeonları görmek gerekir.
Ian Bicking

4
Kullanılması --prefix=$PREFIX_PATH(sistem belirli eki kendisine ekleniyor var olarak kurulum dizininin tam denetime sahip izin vermiyor \Lib\site-packagesörneğin Windows üzerinde). Belirli bir dizini belirtmenin bir yolu var mı?
Piotr Dobrogost

1
@Piotr: Evet cevabımı görüyorum. '--Prefix' kullanmak biraz kaba, ancak saf python'unuzun /usr/local/lib/pythonX.Y/site- yerine /usr/lib/pythonX.Y/site-packages altına girmesini istiyorsanız iyi çalışır. paketler.
Anthon

80
4 yıl önce kötü bir cevap değil, ama --target seçeneği şimdi var.
Tritium21

545

--Target anahtarı aradığınız şey şudur:

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

Ama hala eklemeniz gerekir d:\somewhere\other\than\the\defaultiçin PYTHONPATHaslında bu konumdan bunları kullanmak.

-t, --target <dir>
Paketleri <dir> içine yükleyin. Varsayılan olarak bu, <dir> içindeki mevcut dosya / klasörlerin yerine geçmez.
<dir> içindeki mevcut paketleri yeni sürümlerle değiştirmek için --upgrade öğesini kullanın.


Hedef anahtarı yoksa pip'i yükseltin:

Linux veya OS X'te:

pip install -U pip

Windows'ta (bu bir soruna geçici bir çözüm ):

python -m pip install -U pip

8
@DanH koş pip install --upgrade pip!
r3m0t

16
Bu doğru cevap, sadece seçenek kabul edilen cevaptan biraz sonra eklendi.
bukzor

5
--install-option="--prefix=$PREFIX_PATH"@Ian Bicking tarafından bahsedilen ve --target=$PATHseçenek arasındaki fark nedir ?
Hibou57

6
targetBir pip seçenek olduğunu ve koymak her şey install-optioniçin geçirilir setup.py install command. Temel targetolarak özel site paketleri konumudur.
Janusz Skonieczny

10
Kullanılması --targetbelirtilen önek herhangi dahil komut / veri dosyalarını yüklemek etmemesi nedeniyle, kısmi montaj sonuçlanabilir. Bu geçen gibi görünüyor --prefixile --install-optionkullanılan tesisat öneki üzerinde tam kontrol sahibi olmak sadece uygun şekilde olduğunu.
Kenneth Hoste

74

--targetSeçenek veya seçenek yerine --install-options, aşağıdakilerin iyi çalıştığını gördüm ( https://github.com/pypa/pip/issues/446 adresindeki bu şeyle ilgili bir hata hakkında tartışmadan ):

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

(Veya PYTHONUSERBASEkomutu çalıştırmadan önce ortamınızdaki dizini kullanarak export PYTHONUSERBASE=/path/to/install/to)

Bu çok kullanışlı bir --userseçenek kullanır, ancakbin , lib, sharesen yerine özel bir önek altında beklediğiniz ve diğer dizinleri $HOME/.local.

Sonra bunu PATH , PYTHONPATHNormal bir kurulum dizini olarak ve diğer değişkenlere.

Not Ayrıca belirtmek gerekir ki --upgradeve--ignore-installedPYTHONUSERBASESistemin sağladığı sürümleri geçersiz kılmak için, buna bağlı olan paketler dizinde daha yeni sürümlerin yüklenmesini gerektiriyorsa seçeneklerini .

Tam bir örnek:

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

.. scipyve numpyen son sürümleri daha sonra istediğiniz gibi bir dizine yüklemek ve paketlemek PYTHONPATHiçin (bu örnek için CentOS 6'da bash ve python 2.6 için):

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 kullanmak hala daha iyi ve daha temiz bir çözüm!


4
Bu, Docker kapsayıcılarında çalışan Travis CI ile çalışırken, --install-option = "- prefix = $ PREFIX_PATH" çözümü çalışmadı.
bit

1
Noobie soru ne kadar önemli olduğunu /bin, klasör pip yaratır --usero kadar yapar yaratır --PREFIXoysa --targetdeğil.
Jonathan

1
Paket global Python'a yüklenmişse --ignore-installedgereklidir.
George Sovetov

1
Bu seçenek --editableyerel yüklemelerle de uyumludur .
mdh

1
Bu seçenek, başka bir kök kullanıcısı olmayan kullanıcı için paketleri süper kullanıcı olarak yüklemek için kullanışlıdır su(örneğin kaplarda sorunlu olabilir).
mdh

43

Bir Python paketi kurmak genellikle sadece saf Python dosyaları içerir. Paket veri, komut dosyaları ve / veya yürütülebilir dosyalar içeriyorsa, bunlar saf Python dosyalarından farklı dizinlere yüklenir.

Paketinizde veri / komut dosyası / yürütülebilir dosya bulunmadığını ve Python dosyalarınızın içeri girmesini istediğinizi /python/packages/package_name(ve /python/packageskullandığınızda olduğu gibi birkaç seviye aşağıda bir alt dizine değil) varsayarsak --prefix, bir kerelik komutu kullanabilirsiniz:

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

Paketlerinizin hepsinin (veya çoğunun) oraya gitmesini istiyorsanız, ~/.pip/pip.confaşağıdakileri içerecek şekilde düzenleyebilirsiniz :

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

Bu şekilde, tekrar tekrar belirtmeniz gerektiğini unutamazsınız.

Ek yükleme seçenekleri ( --prefix/ --install-data/ --install-scripts, vb. Ayrıntılar için özel yükleme seçeneklerine bakın) belirtmedikçe pakete dahil olan tüm hariç tutulanlar / veriler / komut dosyaları varsayılan yerlerine gider .


1
Yapılandırma dosyası için büyük bir artı. Ben kişisel olarak --prefixorada belirtiyorum, çünkü ana dizinde paylaşılan bir sunucuda "yerel" bir dizin var ve easy_installben taşınmadan önce önek olarak kullanıldı pip. Sistem $PATHve $PYTHONPATHdaha önce yapılandırılmış. Bunun yerine install-option=--install-purelib=/blahbu yeni target=/blahseçenek / anahtar var. Aynı zamanda güzel, ancak bazen veya --prefixile kullanacağınız için sadece bir yedek almanız gerekir . setup.pyeasy_install
Tomasz Gandor



14

@Ian Bicking'ın cevabına bir puan eklemeniz yeterlidir:

--userYüklü dizini belirtme seçeneğini kullanmak, uzak sunucudaki bir kişinin ana dizinine (sudo kullanıcı hakkı olmadan) bir Python paketi yüklemek istiyorsa da çalışır.

Örneğin,

pip install --user python-memcached

Komut, paketi PYTHONPATH'nizde listelenen dizinlerden birine yükleyecektir.


14

Bu seçenekleri python3.5 ve pip 9.0.3 ile test etti:

pip install --target / myfolder [paketler]

/ Klasörüm altındaki bağımlılıkları içeren TÜM paketleri yükler. Bağımlı paketlerin zaten Python'da başka bir yere kurulduğunu dikkate almaz. / Myfolder / [package_name] dizininden paketler bulacaksınız. Birden fazla Python sürümünüz varsa, bu dikkate alınmaz (paket klasör adında Python sürümü yoktur).

pip install --prefix / myfolder [paketler]

Kontroller zaten kurulu olan bağımlılıklardır. /Myfolder/lib/python3.5/site-packages/[packages içine paketleri kuracak]

pip install --root / myfolder [paketler]

--Prefix, ancak yükleme konumu gibi bağımlılıkları kontrol eder /myfolder/usr/local/lib/python3.5/site-packages/[package_name] olacaktır.

pip install --user [paketler]

Paketleri $ HOME'a yükleyecek: /home/[USER Cialis/.local/lib/python3.5/site-packages Python bu .local yolundan otomatik olarak arama yapar, böylece PYTHONPATH'nize koymanıza gerek kalmaz.

=> Çoğu durumda --kullanıcı kullanmak için en iyi seçenektir. Home klasörü bazı nedenlerden dolayı kullanılamıyorsa --prefix.


Python 2.7.16 altında çalıştırmak, --target (veya --prefix) Jinja2-2.10.1.dist-info / dosyasını yüklerken install --install-option = "- öneki Jinja2-2.10.1-py2'yi kurar .7.egg-info /, aslında istediğim buydu
Greg Dougherty

13

pip(8 veya daha yeni sürümlerin ) daha yeni sürümleri doğrudan --prefixseçeneği kullanabilir :

pip install --prefix=$PREFIX_PATH package_name

nerede $PREFIX_PATHlib, bin ve diğer üst düzey klasörler yerleştirilir kurulum öneki.


10
pip install packageName -t pathOfDirectory

veya

pip install packageName --target pathOfDirectorty

4

Zaten iyi tavsiyeye eklemek için, yazma iznim olmadığında IPython'u yüklerken bir sorun yaşadım /usr/local.

pip, kurulumunu yapmak için distutils kullanır ve bu iş parçacığı ,sys.prefix ayara bağlı .

Benim sorunum IPython yüklemesi '/ usr / local / share / man / man1' 'e Yazma izni verildiğinde İzin verilmedi . Yükleme başarısız olduğu için IPython dosyalarını bin dizinine yazmıyor gibiydi.

"--User" kullanarak çalıştı ve dosyalar ~ / .local yazılmıştır. $ PATH'a ~ / .local / bin eklemek, oradan "ipython" kullanabileceğim anlamına geliyordu.

Ancak bunu birkaç kullanıcı için yüklemeye çalışıyorum ve /usr/local/lib/python2.7dizine yazma izni verildi . Orada bir "bin" dizini oluşturdum ve distutils için yönergeler ayarlayın:

vim ~/.pydistutils.cfg

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

sonra ( -Iönceki hatalara / .local kurulumuna rağmen kurulumu zorlamak için kullanılır):

pip install -I ipython

Sonra ekledi /usr/local/lib/python2.7/binetmek $PATH.

Herkesin sudo erişimi olmayan bir makinede benzer sorunları olması durumunda bunu dahil edeceğimi düşündüm.


2

Python ile demlemek kullanıyorsanız, ne yazık ki, pip / pip3 çok sınırlı seçeneklerle gönderilir. Yukarıda belirtildiği gibi --install-option, --target, --user seçenekleriniz yoktur.

Pip install --user hakkında not
Normal pip install --user demlenmiş Python için devre dışıdır. Homebrew paket önekini ayarlayan bir distutils.cfg yazdığından, bunun nedeni distutils'deki bir hatadır. Olası bir geçici çözüm (~ / Library / Python /./ bin dosyasına yürütülebilir komut dosyaları yerleştiren): python -m pip install --user --install-option="--prefix=" <package-name>

Bu çizgiyi çok hantal bulabilirsiniz. Yönetim için pyenv kullanmanızı öneririm. Kullanıyorsanız

brew upgrade python python3

İronik aslında edilir eski sürüme pip işlevselliği.

(Bu cevabı gönderiyorum, çünkü mac osx'umdaki pip --target seçeneği olmadığından ve düzeltmek için saatler geçirdim)


Açık bir önek ile bu cevap, ve ignore-installedönceki çabaları nedeniyle, benim için çalıştı:python -m pip install --user --install-option="--prefix='/myFunkyApp/lib'" --ignore-installed <package-name>
Jeremy Jones

0

v1.5.6Python'daki v2.7.3(GNU / Linux) pip ile seçenek --root, belirli bir paketin seçeneklerinden bağımsız olarak (görünüşte) global bir kurulum öneki belirtmeye izin verir. Fi'yi deneyin,

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

0

Belgeleri takip etmenizi ve ~ / .pip / pip.conf dosyası oluşturmanızı öneririm. Belgelerde aşağıdaki hataya yol açan belirtilen başlık dizininin eksik olduğuna dikkat edin:

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

Conf dosyasının tam çalışma içeriği:

[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

Ne yazık ki ben yükleyebilirsiniz, ama pip kaldırmaya çalışırken bana kaldırma işlemi için böyle bir paket olduğunu söyler .... bu yüzden bir şey hala yanlış ama paket önceden tanımlanmış konumuna gider.


0

pip install /path/to/package/

artık mümkün.

Bununla ve -eveya --editablebayrağını kullanmanın farkı -e, python yolunuza yüklemek yerine paketin kaydedildiği yere (yani indirme klasörünüze) bağlantılar olmasıdır.

Bu, paketi silerseniz / başka bir klasöre taşırsanız, onu kullanamayacağınız anlamına gelir.


bu soruya cevap vermiyor
Clintm

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.