Jadikan virtualenv mewarisi paket spesifik dari paket situs global Anda


208

Saya sedang mencari cara untuk membuat virtualenv yang akan berisi hanya beberapa perpustakaan (yang saya pilih) dari instalasi python dasar.

Agar lebih konkret, saya mencoba mengimpor matplotlib saya ke virtualenv selama pembuatan virtualenv. Itu tidak dapat diinstal secara efisien dengan pip atau easy_install karena merindukan beberapa lib compiler fortran. Cara saya melakukannya sampai sekarang adalah menyalin secara manual

/usr/lib/python2.7/dist-packages/ to virtualenv_name/lib/python2.7/dist-packages/

namun ini mencegah tautan yang diimpor secara manual didaftarkan oleh kuning telur (yang mencetak semua lib yang tersedia saat ini di virtualenv).

Jadi, apakah ada cara untuk melakukan varian selektif

virtualenv --system-site-packages

16
pengingat lembut - silakan pilih jawaban jika salah satu di bawah ini berfungsi.
foobarbecue

1
Sepertinya 12 orang telah menguji Anda selama beberapa bulan terakhir ...
foobarbecue

2
Mengapa mengganggu OP? Kita semua dapat melihat mana yang merupakan jawaban paling populer; apakah penting apakah dia menerimanya? Saya pikir integritasnya dalam menguji untuk dirinya sendiri, alih-alih mencentang jawaban yang paling populer, harus dikagumi.
Michael Scheper

5
2013: Skor jawaban antara jawaban yang benar dan salah sangat mirip. OP mengatakan dia akan menguji. 2016: Michael Scheper sangat terkesan sehingga OP (tiga tahun lalu) mengatakan akan menguji. 2017: Saya menemukan pertanyaan ini lagi dan merasa terhibur.
foobarbecue

2
Tidak ada jawaban yang benar. OP meminta selektif --system-site-packages. Jawaban menyarankan menggunakan non-selektif --system-site-packagesdan kemudian menginstal ulang beberapa paket secara lokal, apa yang berbeda dan memiliki implikasi yang berbeda.
Piotr Jurkiewicz

Jawaban:


238

Buat lingkungan dengan virtualenv --system-site-packages. Kemudian, aktifkan virtualenv dan ketika Anda ingin hal-hal yang diinstal di virtualenv daripada sistem python, gunakan pip install --ignore-installedatau pip install -I. Dengan cara itu pip akan menginstal apa yang Anda minta secara lokal meskipun versi seluruh sistem ada. Penerjemah python Anda akan mencari pertama di direktori paket virtualenv, sehingga paket-paket itu harus membayangi yang global.


45
Dengan menggunakan -I, Anda akan selalu menginstal ulang paket, meskipun sudah ada di direktori paket situs sistem. Jika Anda menggunakan -U sebagai gantinya, itu akan menginstal versi paket yang lebih baru ke dalam virtualenv Anda, tetapi tidak akan menginstal ulang paket yang sudah tersedia di sistem dengan versi yang diperlukan.
Danilo Bargen

15
Apakah Anda tahu jika ada cara 'mengaktifkan' opsi --system-site-paket pada lingkungan virtual yang dibuat sebelumnya? Saya ingin menghindari kerumitan menginstal ulang semua paket lokal saya!
Gabriel


Saya menemukan jawaban ini sangat menarik, tetapi saya punya kasus yang sangat aneh di mana itu tidak berhasil. Saya memiliki virtualenv dengan no-global-site-packagesdiaktifkan. Tetapi untuk beberapa alasan saya tidak tahu ada paket yang digunakan dari sistem global. Menggunakan pip install -Iuntuk paket dari dalam virtualenv tidak berfungsi. Saya akhirnya mencopot sementara paket baik dari virtualenv dan sistem global, kemudian saya bisa menginstalnya kembali di virtualenv dan dalam sistem (dalam urutan itu). Jadi sekarang berfungsi dengan baik.
kstenger

3
-1 Pertanyaannya meminta agar paket tertentu terlihat, tidak semua kecuali untuk paket gelap. Memasukkan daftar putih perangkat terbatas akan jauh lebih aman daripada membuat daftar putih segalanya karena memungkinkan untuk memastikan bahwa semua paket harus ada di venv kecuali paket yang terdaftar secara eksplisit.
bluenote10

19

Anda dapat menggunakan --system-site-packagesdan kemudian "overinstall" hal-hal spesifik untuk virtualenv Anda. Dengan begitu, semua yang Anda instal ke virtualenv Anda akan diambil dari sana, jika tidak akan diambil dari sistem Anda.


Saya tidak yakin apa yang tidak jelas, tetapi akan mencoba: jika Anda membuat virtualenv dengan opsi --sistem-situs-paket, sistem akan terlebih dahulu mencoba menemukan paket di virtualenv Anda, jika tidak menemukannya di sana, itu akan cobalah untuk menemukannya di instalasi python sistem Anda. Hanya jika tidak menemukannya di sana, itu akan meningkatkan dan ImportError.
schacki

4
Satu-satunya masalah dengan pendekatan ini adalah bahwa Anda sekarang memiliki semua pustaka sistem. Di mana Anda mungkin ingin kontrol yang sangat ketat atas apa yang diinstal.
Dwayne

7
Yang tidak jelas adalah bagaimana ini sebenarnya mungkin! Jika Anda menginstal pip myprog di virtualenv yang dibuat dengan --system-site-paket di mana myprog ada dalam sistem, itu tidak akan "overinstall" myprog. Itu hanya akan menemukan bahwa myprog ada, dan mengatakan "Persyaratan sudah terpenuhi." Jadi ... apa maksudmu?
foobarbecue

-5

Instal env virtual dengan

virtualenv --system-site-packages

dan gunakan pip install -U to install matplotlib


3
Ini kebalikan dari pertanyaan yang diajukan.
Dan Getz

-7

Anda bisa menggunakannya virtualenv --clear. yang tidak akan menginstal paket apa pun, lalu instal yang Anda inginkan.


Itu bukan jawaban untuk pertanyaan aktual tentang bagaimana memanfaatkan beberapa paket seluruh sistem
MrLeeh
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.