virtualenv --no-site-packages dan pip masih menemukan paket global?

140

Saya mendapat kesan bahwa virtualenv --no-site-packagesakan 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 installatas 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-packagesini 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-packagesseharusnya bekerja?

ianw
sumber
4
FYI, --no-site-packages tidak digunakan lagi. Lihat di sini
Salem Ben Mabrouk
@SalemBenMabrouk Tautan rusak, tautan baru di sini. Masalah terkait di Github: Apakah tanda '--no-site-packages' baru-baru ini menghilang?
Ynjxsjmh
1
Di tautan itu, dikatakan --no-site-packagesDEPRECATED. 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.
Ynjxsjmh

Jawaban:

109

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.

wobbily_col
sumber
13
Pahlawanku! Jika Anda hanya ingin memeriksa apakah itu masalah Anda dengan sangat cepat, Anda dapat menjalankan printenv untuk melihat apakah PYTHONPATH ada, dan jika ada, jalankan PYTHONPATH yang tidak disetel. Anda masih harus melacak masalahnya jika Anda tidak ingin masalah muncul lagi, tetapi itu akan memungkinkan Anda mendapatkan virtualenv baru yang disiapkan di sesi shell saat ini.
UltraBob
Homebrew juga melakukan ini!
Rob
1
Saya berharap saya bisa lebih mendukung Anda. Saya datang ke halaman ini lebih dari sekali setelah menemukan hal-hal yang karena PYTHONPATH saya sudah disetel.
Bemmu
Saya tahu ini benar-benar (benar-benar) posting lama, tetapi saya telah mencari di mana-mana, termasuk menanyakan beberapa pertanyaan saya sendiri tentang SO, dan saya tidak tahu bagaimana untuk mulai --no-site-packagesbekerja. Saya hampir saja menghapus ubuntu dan melihat apakah itu memperbaiki banyak hal. Awalnya saya pikir saya mengalami masalah PYTHONPATH yang sama, tetapi saat berlari printenv, saya tidak bisa melihatnya. Frustrasi memuncak, dan bantuan apa pun sangat dihargai. Sys.path saya dari dalam venv yang dibuat dengan --no-site-packagestampaknya menyertakan semua direktori paket saya. Saya belum tahu cara memodifikasi ini. Tolong?
NotAnAmbiTurner
1
menghapus PYTHONPATH dari printenv tidak membantu
Miroslav Radojević
29

Anda harus memastikan bahwa Anda menjalankan pipbiner di lingkungan virtual yang Anda buat, bukan lingkungan global.

env/bin/pip freeze

Lihat tes:

Kami membuat virtualenv dengan --no-site-packagesopsi:

$ 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 freezedari yang baru dibuat pip:

$ 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 piptelah diinstal di seluruh sistem. Dengan memeriksa which pipkita mendapatkan (setidaknya dalam kasus saya) sesuatu seperti /usr/local/bin/pip, yang berarti bahwa ketika kita melakukannya pip freezememanggil biner ini, bukan mytest/bin/pip.

fedorqui 'JADI berhenti merugikan'
sumber
Saya memiliki masalah yang sama. Saya bertanya-tanya bagaimana hal itu bisa terjadi, karena pada awalnya memanggil pip freeze memang menunjukkan kepada saya paket yang benar, tetapi beberapa hari kemudian mulai memanggil yang terletak di / usr / local / bin / ...
jimijazz
1
Ini adalah masalah saya: Saya telah alias pipke jalur tertentu ke pip global, yang tidak ditimpa saat mengaktifkan virtualenv.
MerlinND
1
Anda baru saja menyelamatkan saya, ini bekerja dengan baik untuk saya (pip3 & python3.7) Terima kasih
Saed Yousef
24

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

ianw
sumber
2
FWIW, dengan versi trunk saat ini dari pip dan virtualenv, alur kerja asli Anda sekarang melakukan hal yang benar, bagi saya. Karena itu, saya pribadi masih menghindari -E dan hanya menginstal pip di setiap virtualenv.
Carl Meyer
17

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 dijalankan pip freeze. Jika tidak, Anda akan mendapatkan daftar semua paket global.

finspin
sumber
Terima kasih banyak untuk ini, saya tahu saya harus menggunakan source dengan virtualenv tetapi tidak untuk virtualenvwrapper dan saya tidak pernah mendengar tentang pip freeze. Terima kasih lagi
Tunda
JAWABAN YANG BENAR. setelah menginisialisasi virtualenv Anda harus mengaktifkannya atau Anda akan menggunakan versi sistem python
AsAP_Sherb
17

Hapus sementara PYTHONPATHdengan:

export PYTHONPATH=

Kemudian buat dan aktifkan lingkungan virtual:

virtualenv foo
. foo/bin/activate

Hanya kemudian:

pip freeze
Pedro Torres
sumber
Mencoba membersihkan PYTHONPATH dengan PYTHONPATH yang tidak disetel dan mengekspor PYTHONPATH = dan tidak ada solusi yang membantu.
Miroslav Radojević
15

--no-site-packagesharus, seperti namanya, menghapus direktori paket situs standar dari sys.path. Apa pun yang berada di jalur Python standar akan tetap ada.

Martin v. Löwis
sumber
1
Bagi saya, membersihkan PYTHONPATHdengan saya export PYTHONPATH=sepertinya berhasil.
juniper-
Mencoba membersihkan PYTHONPATH dengan PYTHONPATH yang tidak disetel dan mengekspor PYTHONPATH = dan tidak ada solusi yang membantu. Memanggil python3 -m venv ./venv_dir masih menambahkan paket tingkat sistem. Setelah diaktifkan, pip freeze mencantumkan banyak paket yang diinstal sebelumnya pada tingkat sistem, bukan lingkungan virtual yang bersih. Adakah yang bisa menyarankan solusi lain?
Miroslav Radojević
4

Masalah serupa dapat terjadi pada Windows jika Anda memanggil skrip secara langsung script.pyyang kemudian menggunakan pembuka default Windows dan membuka Python di luar lingkungan virtual. Memanggilnya dengan python script.pyakan menggunakan Python dengan lingkungan virtual.

odie5533
sumber
Harus ada garis shebang di bagian atas skrip (dimulai dengan '! #') Yang mengarah ke tafsir yang akan digunakan.
wobbily_col
2

Ini juga tampaknya terjadi ketika Anda memindahkan direktori virtualenv ke direktori lain (di linux), atau mengganti nama direktori induk.

pors
sumber
1

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.

NotAnAmbiTurner
sumber
1

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/appmenyelesaikan masalah.

mabdrabo.dll
sumber
0

Berikut daftar semua opsi pemasangan pip - Saya tidak menemukan -Eopsi ' ', mungkin versi yang lebih lama memilikinya. Di bawah ini saya membagikan penggunaan bahasa Inggris sederhana dan cara kerja virtualenvuntuk 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-packagesopsi) atau semua paket dari yang ada / pengaturan terakhir (menggunakan --system-site-packagesopsi). Untuk menggunakannya kita harus mengaktifkannya:

$ pip install djangoakan menginstalnya ke dalam paket situs global, dan dengan cara yang sama mendapatkan pip freezeakan memberi nama paket situs global.

sementara di dalam venv dir (foo) yang dijalankan $ source /bin/activateakan 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.

Nabeel Ahmed
sumber
0

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"

virtualenv --no-site-packages --python=/xx/xx/bin/python my_env_nmae

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
  1. Periksa lokasi pip dan lokasi python Anda dan pastikan kedua perintah ini berada di lingkungan virtual
pip --version
which python
  1. Gunakan pip di bawah virtual env untuk menginstal paket yang bebas dari interupsi paket global
pip install package_name

Semoga jawaban ini membantu Anda!

augustus
sumber
virtualenv bekerja dengan python2 secara default, itu diganti dengan venv di python3
Miroslav Radojević
0

Masalah saya adalah versi pipdan python3. Untuk djangopenginstalan versi terbaru , pip3diperlukan. 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.

Mostafa Ghadimi
sumber