virtualenv - no-site-Packages ve pip hala global paketleri bulabiliyor mu?


138

virtualenv --no-site-packagesTamamen ayrı ve izole bir Python ortamı yaratacak izlenim altındaydım , ama öyle görünmüyor.

Örneğin, genel olarak python-django yükledim, ancak farklı bir Django sürümüne sahip bir sanal ağ oluşturmak istiyorum.

$ 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

Söyleyebileceğim kadarıyla, pip -E foo installyukarıdaki Django'nun yeni bir sürümünü yeniden yüklemesi gerekiyor. Ayrıca, pip'e çevreyi dondurmasını söylersem, bir sürü paket alırım. Bu taze bir ortam --no-site-packagesiçin boş olacağını umuyordum?

$ 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 ...

Nasıl --no-site-packagesçalışacağımı yanlış anlıyor muyum ?


4
Bilginize, - site-paketleri kullanımdan kaldırıldı. Buraya bakın
Salem Ben Mabrouk

@SalemBenMabrouk Bağlantı koptu, yeni bağlantı burada. İlgili konu Github: '--no-site-Packages' bayrağı yakın zamanda kayboldu mu?
Ynjxsjmh

Bu bağlamda --no-site-packages, DEPRECATED diyor . Yalnızca geriye dönük uyumluluk için saklanır. Değil küresel site paketleri erişimi olan şimdi varsayılan davranış . Global site paketlerine erişmek istiyorsanız etkinleştirebilirsiniz --system-site-packages.
Ynjxsjmh

Yanıtlar:


108

(Virtualenv'i keşfetmeden çok önce) .bashrc dosyamdaki PYTHONPATH dizinlerini eklemeye gittiğimi fark edene kadar böyle bir sorun yaşadım. Bir yıldan uzun bir süre önce olduğu için, bunu hemen düşünmedim.


12
Benim kahramanım! Sorunun gerçekten hızlı bir şekilde olup olmadığını kontrol etmek istiyorsanız, PYTHONPATH'ın orada olup olmadığını görmek için printenv'i çalıştırabilir ve eğer varsa, ayarlanmamış PYTHONPATH'ı çalıştırın. Sorunun artık açılmasını istemiyorsanız, sorunu izlemeye devam etmeniz gerekecek, ancak bu, geçerli kabuk oturumunda yeni bir virtualenv kurmanıza izin verecektir.
UltraBob

Homebrew da bunu yapıyor!
Rob

1
Keşke seni daha fazla oylayabilseydim. PYTHONPATH'ımın zaten ayarlanmış olması nedeniyle bir şeylerle karşılaştıktan sonra bu sayfaya bir defadan fazla geldim.
Bemmu

Bunun gerçekten (gerçekten) eski bir yazı olduğunu biliyorum, ancak SO ile ilgili kendi sorularımı sormak da dahil olmak üzere her yerde arama yaptım ve nasıl --no-site-packagesçalışacağımı anlayamıyorum. Sadece ubuntu'yu silmeye ve bir şeylerin düzeltilip düzeltilmediğine bakıyorum. Başlangıçta aynı PYTHONPATH problemine sahip olduğumu düşündüm, ama koşarken printenvgöremiyorum. Hayal kırıklığı artıyor ve herhangi bir yardım çok takdir ediliyor. İle oluşturulmuş bir venv içinden sys.path --no-site-packagestüm paket dizinlerimi içeriyor gibi görünüyor. Bunu nasıl değiştireceğimi en sisli değilim. Yardım?
NotAnAmbiTurner

Bu PATH, sanal değişkenin dışından da yürütülebilir dosyalar buluyorsanız global değişkeniniz için de geçerli olabilir .
enderland

28

pipİkili dosyayı, oluşturduğunuz sanal ortamda değil, oluşturduğunuz sanal ortamda çalıştırdığınızdan emin olmalısınız .

env/bin/pip freeze

Bir teste bakın:

Virtualenv'i şu --no-site-packagesseçenekle oluşturuyoruz:

$ 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.

freezeYeni oluşturulandan çıktısını kontrol ediyoruz pip:

$ mytest/bin/pip freeze
argparse==1.3.0
wheel==0.24.0

Ama eğer küresel pipolanı kullanırsak, elde ettiğimiz budur:

$ pip freeze
...
pyxdg==0.25
...
range==1.0.0
...
virtualenv==13.1.2

Yani, piptüm sisteme kurulan tüm paketler . Kontrol ederek which pip(en azından benim durumumda) bir şey /usr/local/bin/pipelde ederiz, yani yaptığımız zaman pip freezebunun yerine bu ikiliyi çağırır mytest/bin/pip.


Ben de aynı problemi yaşadım. Ben nasıl oldu acaba, çünkü ilk arama pip dondurma bana doğru paketleri gösterdi, ama birkaç gün sonra / usr / local / bin / ... bulunan birini aramaya başladı
jimijazz

1
Benim için sorun pipbuydu: Virtualenv etkinleştirilirken geçersiz kılınmamış olan, küresel pip için belirli bir yola takılmıştım.
merlinND

1
Beni kurtardın, bu benim için iyi çalıştı (pip3 ve python3.7) Teşekkürler
Saed Yousef

24

Sonunda, ne olursa olsun, pip -E'nin çalışmadığını gördüm. Ancak, sanalenv'yi gerçekten etkinleştirirsem ve pip yüklemek için virtualenv tarafından sağlanan easy_install'u kullanırsam, daha sonra pip'i doğrudan içeriden kullanırsam, beklendiği gibi çalışır ve yalnızca virtualenv'deki paketleri gösterir


2
FWIW, pip ve virtualenv'in güncel gövde sürümleriyle orijinal iş akışınız artık benim için doğru olanı yapıyor. Bununla birlikte, kişisel olarak hala -E'den kaçınıyorum ve her sanal ekrana pip takıyorum.
Carl Meyer

17

Bunun çok eski bir soru olduğunu biliyorum ama buraya gelenler için bir çözüm arıyorlar:

Çalıştırmadansource bin/activate önce virtualenv ( ) işlevini etkinleştirmeyi unutmayın pip freeze. Aksi takdirde tüm global paketlerin bir listesini alırsınız.


Bunun için çok teşekkür ederim, virtualenv ile kaynak kullanmak zorunda olduğumu biliyordum ama virtualenvwrapper için kullanmadım ve pip donmasını hiç duymadım. Tekrar teşekkürler
Deepend

DOĞRU CEVAP. virtualenv'i başlattıktan sonra etkinleştirmelisiniz ya da
python'un

16

Şunu geçici olarak temizleyin PYTHONPATH:

export PYTHONPATH=

Ardından sanal ortamı oluşturun ve etkinleştirin:

virtualenv foo
. foo/bin/activate

Ondan sonra:

pip freeze

15

--no-site-packagesadından da anlaşılacağı gibi, standart site paketleri dizinini kaldırmalısınız sys.path. Standart Python yolunda yaşayan her şey orada kalacak.


1
Benim için temizlik PYTHONPATHile export PYTHONPATH=hile yapmak gibiydi.
ardıç

4

Komut dosyalarını doğrudan çağırırsanız script.py, Windows varsayılan açıcısını kullanır ve Python'u sanal ortamın dışında açarsa benzer bir sorun Windows'ta da oluşabilir . İle python script.pyçağrıldığında sanal ortamla Python kullanılır.


Senaryonun üstünde, kullanılan e olan yorumu işaret eden ('! #' İle başlayan) bir shebang satırı bulunmalıdır.
wobbily_col

2

Bu, virtualenv dizinini başka bir dizine (linux üzerinde) taşıdığınızda veya bir üst dizini yeniden adlandırdığınızda da gerçekleşir.


1

Aynı sorunu yaşıyordum. Benim için sorun (Ubuntu'da) yol adımın içerilmesiydi $. $ Dir dışında bir virtualenv oluşturduğumda, iyi çalıştı.

Tuhaf.


1

Virtualenv pip'in çalışmamasının olası nedenlerinden biri, üst klasörlerden herhangi birinin adında sorunu çözmek /Documents/project name/app için yeniden adlandırma alanı olması /Documents/projectName/app.


1

Venv'deki pip'in hala küresel pip gibi çalıştığı aynı problemle karşılaştım.
Birçok sayfayı aradıktan sonra, bu şekilde anladım.
1. "--no-site-Packages" seçeneğiyle virtualenv tarafından yeni bir venv oluşturun

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

"- no-site-Packages" seçeneğinin, virtualenv'in doc dosyasında 1.7.0'dan beri varsayılan olarak doğru olmasına rağmen, ancak manuel olarak ayarlamadığınız sürece işe yaramadığını unutmayın. Saf bir venv elde etmek için, bu seçeneği 2'yi açmanızı şiddetle tavsiye ederim.

source ./my_env_name/bin/activate
  1. Pip konumunuzu ve python konumunuzu kontrol edin ve bu iki komutun sanal ortam altında olduğundan emin olun
pip --version
which python
  1. Global paketlerden bağımsız paketleri kurmak için sanal env altında pip kullanın
pip install package_name

Bu cevabın size yardımcı olmasını dilerim!


0

İşte tüm pip yükleme seçeneklerinin listesi - Herhangi bir ' -E' seçeneği bulamadım , eski sürümde olabilir. Aşağıda basit bir İngilizce kullanımını paylaşıyorum virtualenvve gelecek SO kullanıcıları için çalışıyorum .


Her şey iyi gözüküyor, virtualenv( foo) öğesini etkinleştirmeyi kabul et . Yaptığımız tek şey, üretimde önceki bir sürümümüz olması ve en son Django sürümümüzü test etmek istememiz durumunda, çeşitli Python sürümleri veya çeşitli Django sürümleri veya başka bir Python paketi olan çoklu (ve değişen) python ortamına sahip olmamıza izin vermektir. uygulama.

Kısacası sanal ortam ( virtualenv) oluşturmak ve kullanmak ( ), uygulamamızı veya farklı Python yorumlayıcıları olan Python 2.7 ve 3.3 ile basit python komut dosyalarını çalıştırmayı veya test etmeyi mümkün kılar, yeni bir kurulum ( --no-site-packagesseçenek kullanarak ) veya mevcut tüm paketler olabilir / son kurulum ( --system-site-packagesseçeneği kullanarak ). Kullanmak için etkinleştirmeliyiz:

$ pip install djangoglobal site paketlerine yükleyecek ve benzer şekilde pip freezeglobal site paketlerinin adlarını alacaktır.

venv dir (foo) içinde yürütme $ source /bin/activatevenv yani şimdi pip ile yüklü herhangi bir şey sadece sanal env yüklenecek ve sadece pip dondurma küresel site paketleri python paketleri listesini vermeyecektir. Etkinleştirildikten sonra:

$ 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)$işaret sanal bir python ortamı kullandığımızı göstermeden önce, yani pip - install, donma, kaldırma ile ilgili herhangi bir şey bu venv ile sınırlı olacak ve global / varsayılan Python kurulum / paketleri üzerinde hiçbir etkisi olmayacaktır.


0

Benim sorunum pipve python3sürümleri oldu. djangoYüklemenin en son sürümü pip3için gereklidir. Bu yüzden, aşağıdaki komutları kullanarak sanal ortamı oluşturduktan sonra sorunum çözüldü:

> virtualenv --python=python3 venv
> source venv/bin/activate
> which pip3 #should be different from /usr/local/bin/pip3
...<some-directory>/venv/bin/pip3
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.