Instal paket Python ke direktori lain menggunakan pip?


435

Saya tahu jawaban yang jelas adalah dengan menggunakan virtualenv dan virtualenvwrapper, tetapi karena berbagai alasan saya tidak bisa / tidak ingin melakukan itu.

Jadi bagaimana cara memodifikasi perintah

pip install package_name

untuk membuat pipinstal paket di tempat selain default site-packages?



2
Sekarang pertanyaan nomor dua: ketika Anda sudah menginstal ke direktori kustom, bagaimana membuat pipJANGAN mencoba untuk menghapus dan versi yang lebih lama dari direktori non-kustom. Misalnya - sistem yang luas, di mana Anda tidak memiliki izin menulis. Sejauh ini saya hanya melakukan ini dengan easy_install...
Tomasz Gandor

2
@ ThomaszGandor Saya pikir menggunakan --ignore-installedopsi harus mencegah pip dari mencoba untuk menghapus paket yang sudah diinstal.
Piotr Dobrogost

maaf saya baru dengan pip, tetapi apakah pertanyaan Anda sama dengan bertanya "bagaimana cara menginstal pi ke versi python yang berbeda"? Saya memiliki python 3.4 dan 3.5 tetapi saya ingin instalasi pip saya pergi ke python 3.5.
Charlie Parker

@ Chrislie Tidak, pertanyaan yang berbeda. Saya tidak cukup tahu tentang instalasi / niat Anda, tetapi secara umum saya mungkin akan menggunakan virtualenvwrapper dan membuat lingkungan virtual dengan sesuatu sepertimkvirtualenv --python=/usr/bin/python3.5 env_name
Monika Sulik

Jawaban:


334

Menggunakan:

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

Anda mungkin juga ingin menggunakan --ignore-installeduntuk memaksa semua dependensi diinstal ulang menggunakan awalan baru ini. Anda dapat menggunakan --install-optionbeberapa kali untuk menambahkan opsi yang dapat Anda gunakan python setup.py install( --prefixmungkin itu yang Anda inginkan, tetapi ada banyak opsi yang dapat Anda gunakan).


5
jika Anda melakukan ini, apakah ada cara untuk bisa pip freezemelihat direktori alternatif?
Russ

7
pip freeze terlihat di jalan, jadi jika Anda seperti PYTHONPATH=$PREFIX_PATH/lib/python2.6/site-packages pip freezeitu akan melihatnya.
Ian Bicking

4
Penggunaan --prefix=$PREFIX_PATHtampaknya tidak memungkinkan untuk memiliki kontrol penuh terhadap direktori instalasi karena ada sufiks khusus sistem yang ditambahkan padanya ( \Lib\site-packagespada Windows misalnya). Apakah ada cara untuk menentukan direktori tertentu?
Piotr Dobrogost

1
@Piotr: ya ada lihat jawaban saya. Menggunakan '--prefix' agak kasar, tetapi berfungsi dengan baik jika Anda ingin python murni Anda berada di bawah /usr/lib/pythonX.Y/site-packages alih-alih /usr/local/lib/pythonX.Y/site- paket.
Anthon

80
Bukan jawaban yang buruk 4 tahun yang lalu, tetapi opsi --target ada sekarang.
Tritium21

545

The --target switch adalah hal yang Anda cari:

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

Tapi Anda masih perlu menambahkan d:\somewhere\other\than\the\defaultuntuk PYTHONPATHbenar-benar menggunakan mereka dari lokasi itu.

-t, --target <dir>
Instal paket ke <dir>. Secara default ini tidak akan mengganti file / folder yang ada di <dir>.
Gunakan --upgrade untuk mengganti paket yang ada di <dir> dengan versi baru.


Tingkatkan pip jika sakelar target tidak tersedia:

Di Linux atau OS X:

pip install -U pip

Di Windows (ini mengatasi masalah ):

python -m pip install -U pip

8
@DanH lari pip install --upgrade pip!
r3m0t

16
Ini adalah jawaban yang benar, hanya saja opsi ditambahkan sedikit setelah jawaban yang diterima.
bukzor

5
Apa perbedaan antara yang --install-option="--prefix=$PREFIX_PATH"disebutkan oleh @Ian Bicking dan --target=$PATHopsinya?
Hibou57

6
targetadalah opsi pip, dan semua yang Anda masukkan install-optionakan diteruskan ke setup.py install command. Pada dasarnya targetadalah lokasi paket situs kustom.
Janusz Skonieczny

10
Menggunakan --targetdapat mengakibatkan instalasi parsial, karena tidak akan menginstal skrip / file data termasuk dalam awalan yang ditentukan. Sepertinya lulus --prefixdengan --install-optionadalah satu-satunya cara yang tepat untuk memiliki kontrol penuh atas awalan instalasi yang digunakan.
Kenneth Hoste

74

Alih-alih --targetopsi atau --install-optionsopsi, saya menemukan bahwa berikut ini berfungsi dengan baik (dari diskusi tentang bug tentang hal ini di https://github.com/pypa/pip/issues/446 ):

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

(Atau atur PYTHONUSERBASEdirektori di lingkungan Anda sebelum menjalankan perintah, menggunakan export PYTHONUSERBASE=/path/to/install/to)

Ini menggunakan sangat berguna --userpilihan tetapi mengatakan itu untuk membuat bin, lib, sharedan direktori lain yang Anda harapkan di bawah awalan kustom daripada $HOME/.local.

Kemudian Anda dapat menambahkan ini ke variabel Anda PATH, PYTHONPATHdan lainnya seperti pada direktori instalasi normal.

Perhatikan bahwa Anda mungkin juga perlu menentukan opsi --upgradedan --ignore-installedjika ada paket di mana ini tergantung memerlukan versi yang lebih baru untuk diinstal di PYTHONUSERBASEdirektori, untuk menimpa versi yang disediakan sistem.

Contoh lengkap:

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

..untuk menginstal scipydan numpymengemas versi terbaru ke dalam direktori yang dapat Anda sertakan di PYTHONPATHlike Anda (menggunakan bash dan untuk python 2.6 pada CentOS 6 untuk contoh ini):

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

Menggunakan virtualenv masih merupakan solusi yang lebih baik dan lebih rapi!


4
Ini bekerja dengan Travis CI berjalan pada wadah Docker sedangkan solusi --install-option = "- prefix = $ PREFIX_PATH" tidak.
32bits

1
Pertanyaan Noobie, seberapa pentingkah /binfolder pip dibuat, --usermembuatnya seperti halnya --PREFIXsedangkan --targettidak.
Jonathan

1
Jika paket diinstal dalam Python global, --ignore-installeddiperlukan.
George Sovetov

1
Opsi ini juga kompatibel dengan --editabledan pemasangan lokal.
mdh

1
Opsi ini berguna untuk menginstal paket sebagai superuser untuk pengguna non-root lain tanpa harus suberkeliling (yang mungkin bermasalah dalam wadah, misalnya).
mdh

43

Menginstal paket Python seringkali hanya menyertakan beberapa file Python murni. Jika paket termasuk data, skrip dan atau file yang dapat dieksekusi, ini diinstal di direktori yang berbeda dari file Python murni.

Dengan asumsi paket Anda tidak memiliki data / skrip / executable, dan Anda ingin file Python Anda masuk /python/packages/package_name(dan bukan beberapa subdirektori beberapa tingkat di bawah ini /python/packagesketika menggunakan --prefix), Anda dapat menggunakan perintah satu kali:

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

Jika Anda ingin semua (atau sebagian besar) paket Anda pergi ke sana, Anda dapat mengedit Anda ~/.pip/pip.confuntuk memasukkan:

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

Dengan begitu Anda tidak bisa lupa harus menentukannya lagi dan lagi.

Setiap file / skrip / data yang dapat dieksekusi yang termasuk dalam paket akan tetap pergi ke tempat default kecuali jika Anda menentukan opsi instalasi tambahan ( --prefix/ --install-data/ --install-scripts, dll., Untuk detail lihat opsi instalasi kustom ).


1
Nilai tambah besar untuk file konfigurasi. Saya pribadi menentukan di --prefixsana, karena saya memiliki direktori "lokal" pada server bersama di direktori home, dan itu digunakan sebagai awalan easy_installsebelum saya pindah ke pip. Sistem $PATHdan $PYTHONPATHdikonfigurasikan sebelumnya. Alih-alih install-option=--install-purelib=/blahada target=/blahopsi / switch yang lebih baru ini . Ini juga bagus, tetapi kadang-kadang Anda hanya membutuhkan pengganti --prefix, yang akan Anda gunakan dengan setup.pyatau easy_install.
Tomasz Gandor


18

Sepertinya tidak ada yang menyebutkan opsi -t tetapi yang paling mudah:

pip install -t <direct directory> <package>

8
The -tpilihan adalah versi pendek dari --targetpilihan yang telah dijelaskan dalam jawaban lain ( stackoverflow.com/a/19404371/594053 ) :)
MattiSG

14

Tambahkan saja satu poin ke jawaban @Ian Bicking:

Menggunakan --useropsi untuk menentukan direktori yang diinstal juga berfungsi jika seseorang ingin menginstal beberapa paket Python ke direktori home seseorang (tanpa hak pengguna sudo) pada server jauh.

Misalnya,

pip install --user python-memcached

Perintah akan menginstal paket ke salah satu direktori yang terdaftar di PYTHONPATH Anda.


14

Diuji opsi ini dengan python3.5 dan pip 9.0.3:

pip install --target / myfolder [paket]

Instal SEMUA paket termasuk dependensi pada / myfolder. Tidak memperhitungkan bahwa paket dependen sudah diinstal di tempat lain dengan Python. Anda akan menemukan paket dari / myfolder / [package_name]. Jika Anda memiliki beberapa versi Python, ini tidak memperhitungkannya (tidak ada versi Python dalam nama folder paket).

instal pip --prefix / myfolder [paket]

Cek adalah dependensi yang sudah diinstal. Akan menginstal paket ke /myfolder/lib/python3.5/site-packages/[packages]

install pip --root / myfolder [paket]

Memeriksa dependensi seperti --prefix tetapi lokasi instal adalah /myfolder/usr/local/lib/python3.5/site-packages/[package_name].

pip install --user [paket]

Akan menginstal paket ke $ HOME: /home/[USER[/.local/lib/python3.5/site-packages Python mencari secara otomatis dari .local path ini sehingga Anda tidak perlu memasukkannya ke PYTHONPATH Anda.

=> Dalam sebagian besar kasus --user adalah pilihan terbaik untuk digunakan. Jika folder rumah tidak dapat digunakan karena beberapa alasan maka --prefix.


Berjalan di bawah python 2.7.16, --target (atau --prefix) menginstal Jinja2-2.10.1.dist-info / misalnya, sedangkan instal --install-option = "- awalan menginstal Jinja2-2.10.1-py2 .7.egg-info /, yang sebenarnya saya inginkan
Greg Dougherty

13

Versi yang lebih baru dari pip(8 atau lebih baru) dapat langsung menggunakan --prefixopsi :

pip install --prefix=$PREFIX_PATH package_name

di mana $PREFIX_PATHawalan instalasi tempat lib, nampan dan folder tingkat atas lainnya ditempatkan.


10
pip install packageName -t pathOfDirectory

atau

pip install packageName --target pathOfDirectorty

4

Untuk menambah saran yang sudah baik, karena saya memiliki masalah menginstal IPython ketika saya tidak memiliki izin menulis /usr/local.

pip menggunakan distutils untuk melakukan instalasinya dan utas ini membahas bagaimana hal itu dapat menyebabkan masalah karena bergantung pada sys.prefixpengaturan.

Masalah saya terjadi ketika instalasi IPython mencoba menulis ke '/ usr / local / share / man / man1' dengan Izin ditolak . Ketika instalasi gagal tampaknya tidak menulis file IPython di direktori bin.

Menggunakan "--user" berfungsi dan file ditulis ke ~ / .local. Menambahkan ~ / .local / bin ke $ PATH berarti saya bisa menggunakan "ipython" dari sana.

Namun saya mencoba untuk menginstal ini untuk sejumlah pengguna dan telah diberi izin menulis ke /usr/local/lib/python2.7direktori. Saya membuat direktori "bin" di bawah sana dan mengatur arahan untuk distutils:

vim ~/.pydistutils.cfg

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

then ( -Idigunakan untuk memaksa instalasi meskipun gagal sebelumnya / .local install):

pip install -I ipython

Lalu aku menambahkan /usr/local/lib/python2.7/binuntuk $PATH.

Saya pikir saya akan memasukkan ini jika ada orang lain yang memiliki masalah serupa pada mesin yang mereka tidak memiliki akses sudo.


2

Jika Anda menggunakan minuman dengan python, sayangnya, pip / pip3 dikirimkan dengan opsi yang sangat terbatas. Anda tidak memiliki opsi --install-option, --target, --user seperti yang disebutkan di atas.

Catatan pada pip install --user Pip install --user
normal dinonaktifkan untuk diseduh Python. Ini karena bug pada distutils, karena Homebrew menulis distutils.cfg yang menetapkan awalan paket. Solusi yang mungkin (yang menempatkan skrip yang dapat dieksekusi ke dalam ~ / Library / Python /./ bin) adalah: python -m pip install --user --install-option="--prefix=" <package-name>

Anda mungkin menemukan kalimat ini sangat tidak praktis. Saya sarankan gunakan pyenv untuk manajemen. Jika Anda menggunakan

brew upgrade python python3

Ironisnya Anda sebenarnya menurunkan fungsi pip.

(Saya memposting jawaban ini, hanya karena pip di mac osx saya tidak memiliki opsi --target, dan saya telah menghabiskan berjam-jam memperbaikinya)


Jawaban ini dengan awalan eksplisit, dan ignore-installedkarena upaya sebelumnya, bekerja untuk saya:python -m pip install --user --install-option="--prefix='/myFunkyApp/lib'" --ignore-installed <package-name>
Jeremy Jones

0

Dengan pip v1.5.6pada Python v2.7.3(GNU / Linux), opsi --rootmemungkinkan untuk menentukan awalan instalasi global, (tampaknya) terlepas dari opsi paket tertentu. Coba fi,

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

0

Saya sarankan untuk mengikuti dokumentasi dan membuat file ~ / .pip / pip.conf. Catatan dalam dokumentasi ada tidak ada direktori header yang ditentukan, yang mengarah ke kesalahan berikut:

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

Konten conf file yang berfungsi penuh adalah:

[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

Sayangnya saya dapat menginstal, tetapi ketika mencoba untuk menghapus pip memberitahu saya tidak ada paket untuk proses penghapusan .... jadi ada sesuatu yang salah tetapi paket pergi ke lokasi yang telah ditentukan.


0

pip install /path/to/package/

sekarang mungkin.

Bedanya dengan ini dan menggunakan -eatau --editablebendera adalah bahwa-e tautan ke tempat paket disimpan (yaitu folder unduhan Anda), daripada menginstalnya ke jalur python Anda.

Ini berarti jika Anda menghapus / memindahkan paket ke folder lain, Anda tidak akan dapat menggunakannya.


ini tidak menjawab pertanyaan
Clintm

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.