Saya mendapat kesan bahwa virtualenv --no-site-packages
akan menciptakan lingkungan Python yang benar-benar terpisah dan terisolasi, tetapi tampaknya tidak.
Sebagai contoh, saya telah menginstal python-django secara global, tetapi ingin membuat virtualenv dengan versi Django yang berbeda.
$ virtualenv --no-site-packages foo
New python executable in foo/bin/python
Installing setuptools............done.
$ pip -E foo install Django
Requirement already satisfied: Django in /usr/share/pyshared
Installing collected packages: Django
Successfully installed Django
Dari apa yang saya dapat katakan, di pip -E foo install
atas seharusnya memasang ulang versi baru Django. Juga, jika saya memberi tahu pip untuk membekukan lingkungan, saya mendapatkan banyak paket. Saya berharap bahwa untuk lingkungan yang segar dengan --no-site-packages
ini akan menjadi kosong?
$ pip -E foo freeze
4Suite-XML==1.0.2
BeautifulSoup==3.1.0.1
Brlapi==0.5.3
BzrTools==1.17.0
Django==1.1
... and so on ...
Apakah saya salah paham bagaimana --no-site-packages
seharusnya bekerja?
python
virtualenv
pip
ianw
sumber
sumber
--no-site-packages
DEPRECATED. Hanya dipertahankan untuk kompatibilitas ke belakang. Tidak memiliki akses ke paket situs global sekarang menjadi perilaku default . Jika Anda ingin mengakses paket situs global, Anda dapat mengaktifkan--system-site-packages
.Jawaban:
Saya mengalami masalah seperti ini, sampai saya menyadari bahwa (jauh sebelum saya menemukan virtualenv), saya telah menambahkan direktori ke PYTHONPATH di file .bashrc saya. Karena sudah lebih dari setahun sebelumnya, saya tidak langsung memikirkannya.
sumber
--no-site-packages
bekerja. Saya hampir saja menghapus ubuntu dan melihat apakah itu memperbaiki banyak hal. Awalnya saya pikir saya mengalami masalah PYTHONPATH yang sama, tetapi saat berlariprintenv
, saya tidak bisa melihatnya. Frustrasi memuncak, dan bantuan apa pun sangat dihargai. Sys.path saya dari dalam venv yang dibuat dengan--no-site-packages
tampaknya menyertakan semua direktori paket saya. Saya belum tahu cara memodifikasi ini. Tolong?Anda harus memastikan bahwa Anda menjalankan
pip
biner di lingkungan virtual yang Anda buat, bukan lingkungan global.Lihat tes:
Kami membuat virtualenv dengan
--no-site-packages
opsi:$ virtualenv --no-site-packages -p /usr/local/bin/python mytest Running virtualenv with interpreter /usr/local/bin/python New python executable in mytest/bin/python Installing setuptools, pip, wheel...done.
Kami memeriksa output
freeze
dari yang baru dibuatpip
:$ mytest/bin/pip freeze argparse==1.3.0 wheel==0.24.0
Tetapi jika kita menggunakan global
pip
, inilah yang kita dapatkan:$ pip freeze ... pyxdg==0.25 ... range==1.0.0 ... virtualenv==13.1.2
Artinya, semua paket yang
pip
telah diinstal di seluruh sistem. Dengan memeriksawhich pip
kita mendapatkan (setidaknya dalam kasus saya) sesuatu seperti/usr/local/bin/pip
, yang berarti bahwa ketika kita melakukannyapip freeze
memanggil biner ini, bukanmytest/bin/pip
.sumber
pip
ke jalur tertentu ke pip global, yang tidak ditimpa saat mengaktifkan virtualenv.Akhirnya saya menemukan bahwa, untuk alasan apa pun, pip -E tidak berfungsi. Namun, jika saya benar-benar mengaktifkan virtualenv, dan menggunakan easy_install yang disediakan oleh virtualenv untuk menginstal pip, lalu gunakan pip langsung dari dalam, sepertinya berfungsi seperti yang diharapkan dan hanya menampilkan paket di virtualenv
sumber
Saya tahu ini pertanyaan yang sangat lama tetapi bagi mereka yang tiba di sini mencari solusi:
Jangan lupa untuk mengaktifkan virtualenv (
source bin/activate
) sebelum dijalankanpip freeze
. Jika tidak, Anda akan mendapatkan daftar semua paket global.sumber
Hapus sementara
PYTHONPATH
dengan:Kemudian buat dan aktifkan lingkungan virtual:
Hanya kemudian:
sumber
--no-site-packages
harus, seperti namanya, menghapus direktori paket situs standar darisys.path
. Apa pun yang berada di jalur Python standar akan tetap ada.sumber
PYTHONPATH
dengan sayaexport PYTHONPATH=
sepertinya berhasil.Masalah serupa dapat terjadi pada Windows jika Anda memanggil skrip secara langsung
script.py
yang kemudian menggunakan pembuka default Windows dan membuka Python di luar lingkungan virtual. Memanggilnya denganpython script.py
akan menggunakan Python dengan lingkungan virtual.sumber
Ini juga tampaknya terjadi ketika Anda memindahkan direktori virtualenv ke direktori lain (di linux), atau mengganti nama direktori induk.
sumber
Saya mengalami masalah yang sama. Masalah bagi saya (di Ubuntu) adalah nama jalur saya terkandung
$
. Ketika saya membuat virtualenv di luar $ dir, itu berfungsi dengan baik.Aneh.
sumber
Salah satu kemungkinan alasan mengapa pip virtualenv tidak berfungsi adalah jika salah satu folder induk memiliki ruang dalam namanya,
/Documents/project name/app
mengganti namanya untuk/Documents/projectName/app
menyelesaikan masalah.sumber
Berikut daftar semua opsi pemasangan pip - Saya tidak menemukan
-E
opsi ' ', mungkin versi yang lebih lama memilikinya. Di bawah ini saya membagikan penggunaan bahasa Inggris sederhana dan cara kerjavirtualenv
untuk pengguna SO yang akan datang.Setiap hal tampak baik-baik saja, terima mengaktifkan
virtualenv
(foo
). Semua yang dilakukannya adalah memungkinkan kita memiliki banyak (dan memvariasikan) lingkungan python yaitu berbagai versi Python, atau berbagai versi Django, atau paket Python lainnya - jika kita memiliki versi sebelumnya dalam produksi dan ingin menguji terbitan Django terbaru dengan kita aplikasi.Singkatnya, membuat dan menggunakan (mengaktifkan) lingkungan virtual (
virtualenv
) memungkinkan untuk menjalankan atau menguji aplikasi kita atau skrip python sederhana dengan interpreter Python yang berbeda yaitu Python 2.7 dan 3.3 - dapat berupa instalasi baru (menggunakan--no-site-packages
opsi) atau semua paket dari yang ada / pengaturan terakhir (menggunakan--system-site-packages
opsi). Untuk menggunakannya kita harus mengaktifkannya:$ pip install django
akan menginstalnya ke dalam paket situs global, dan dengan cara yang sama mendapatkanpip freeze
akan memberi nama paket situs global.sementara di dalam venv dir (foo) yang dijalankan
$ source /bin/activate
akan mengaktifkan venv yaitu sekarang apa pun yang diinstal dengan pip hanya akan diinstal di env virtual, dan hanya sekarang pembekuan pip tidak akan memberikan daftar paket situs-paket global python. Setelah diaktifkan:$ virtualenv --no-site-packages foo New python executable in foo/bin/python Installing setuptools............done. $ cd foo $ source bin/activate (foo)$ pip install django
(foo)
sebelum$
tanda menunjukkan kita menggunakan lingkungan python virtual yaitu segala sesuatu dengan pip - install, freeze, uninstall akan dibatasi pada venv ini, dan tidak berpengaruh pada instalasi / paket Python global / default.sumber
Saya menemukan masalah yang sama di mana pip in venv masih berfungsi sebagai pip global.
Setelah mencari banyak halaman, saya mengetahuinya dengan cara ini.
1. Buat venv baru dengan virtualenv dengan opsi "--no-site-packages"
harap dicatat bahwa meskipun opsi "--no-site-packages" adalah default true sejak 1.7.0 di file doc virtualenv, tetapi saya merasa itu tidak berfungsi kecuali Anda menyetelnya secara manual. Untuk mendapatkan venv murni, saya sangat menyarankan untuk mengaktifkan opsi ini 2. Aktifkan env baru yang Anda buat
source ./my_env_name/bin/activate
pip --version which python
Semoga jawaban ini membantu Anda!
sumber
Masalah saya adalah versi
pip
danpython3
. Untukdjango
penginstalan versi terbaru ,pip3
diperlukan. Jadi masalah saya terpecahkan setelah membuat lingkungan virtual menggunakan perintah berikut:> virtualenv --python=python3 venv > source venv/bin/activate > which pip3 #should be different from /usr/local/bin/pip3 ...<some-directory>/venv/bin/pip3
PS Masalah ini terjadi karena versi default python saya di ubuntu adalah 2.7. Dengan menggunakan perintah di atas itu akan mengabaikan versi default.
sumber