Miałem wrażenie, virtualenv --no-site-packages
że stworzy całkowicie oddzielne i izolowane środowisko Pythona, ale tak się nie dzieje.
Na przykład mam python-django zainstalowany globalnie, ale chcę stworzyć virtualenv z inną wersją Django.
$ 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
Z tego co wiem, pip -E foo install
powyższe powinno przeinstalować nową wersję Django. Ponadto, jeśli powiem pipowi, aby zamroził środowisko, otrzymam całą masę pakietów. Spodziewałbym się, że dla świeżego środowiska z --no-site-packages
tym byłoby puste?
$ 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 ...
Czy nie rozumiem, jak --no-site-packages
powinno działać?
python
virtualenv
pip
Ianw
źródło
źródło
--no-site-packages
DEPRECATED. Zachowane tylko w celu zapewnienia zgodności z poprzednimi wersjami. Brak dostępu do globalnych pakietów witryn jest teraz domyślnym zachowaniem . Jeśli chcesz uzyskać dostęp do globalnych pakietów witryn, możesz włączyć--system-site-packages
.Odpowiedzi:
Miałem taki problem, dopóki nie zdałem sobie sprawy, że (na długo przed odkryciem virtualenv) zacząłem dodawać katalogi do PYTHONPATH w moim pliku .bashrc. Ponieważ minęło ponad rok wcześniej, nie pomyślałem o tym od razu.
źródło
--no-site-packages
do pracy. Zbliżam się do wyczyszczenia Ubuntu i sprawdzenia, czy to naprawi sytuację. Początkowo myślałem, że mam ten sam problem z PYTHONPATH, ale po uruchomieniuprintenv
go nie widzę. Frustracja narasta, a każda pomoc jest mile widziana. Moja ścieżka sys.path z wnętrza Venv utworzonego za pomocą--no-site-packages
wydaje się zawierać wszystkie moje katalogi z pakietami. Nie mam pojęcia, jak to zmienić. Wsparcie?PATH
zmiennej globalnej , jeśli szukasz plików wykonywalnych spoza virtualenv.Musisz upewnić się, że uruchamiasz
pip
plik binarny w utworzonym środowisku wirtualnym, a nie globalnym.Zobacz test:
Tworzymy virtualenv z
--no-site-packages
opcją:Sprawdzamy wynik
freeze
z nowo utworzonychpip
:Ale jeśli używamy globalnego
pip
, otrzymujemy to:To znaczy wszystkie pakiety, które
pip
zostały zainstalowane w całym systemie. Sprawdzającwhich pip
, otrzymujemy (przynajmniej w moim przypadku) coś takiego/usr/local/bin/pip
, co oznacza, że kiedy to robimypip freeze
, wywołujemy ten plik binarny zamiastmytest/bin/pip
.źródło
pip
do określonej ścieżki do globalnego pip, która nie była nadpisywana podczas aktywacji virtualenv.W końcu stwierdziłem, że z jakiegoś powodu pip -E nie działa. Jeśli jednak faktycznie aktywuję virtualenv i używam easy_install dostarczanego przez virtualenv do instalacji pip, to używam pip bezpośrednio z wewnątrz, wydaje się, że działa zgodnie z oczekiwaniami i pokazuje pakiety tylko w virtualenv
źródło
Wiem, że to bardzo stare pytanie, ale dla przyjeżdżających tutaj szukających rozwiązania:
Nie zapomnij aktywować virtualenv (
source bin/activate
) przed uruchomieniempip freeze
. W przeciwnym razie otrzymasz listę wszystkich pakietów globalnych.źródło
Tymczasowo wyczyść za
PYTHONPATH
pomocą:Następnie utwórz i aktywuj środowisko wirtualne:
Tylko wtedy:
źródło
--no-site-packages
powinien, jak sugeruje nazwa, usunąć standardowy katalog site-packages zsys.path
. Wszystko inne, co żyje w standardowej ścieżce Pythona, pozostanie tam.źródło
PYTHONPATH
zexport PYTHONPATH=
wydawało się rade.Podobny problem może wystąpić w systemie Windows, jeśli wywołujesz skrypty bezpośrednio,
script.py
które następnie używają domyślnego otwieracza systemu Windows i otwierają Pythona poza środowiskiem wirtualnym. Wywołanie go za pomocąpython script.py
spowoduje użycie Pythona w środowisku wirtualnym.źródło
Wydaje się, że dzieje się tak również, gdy przenosisz katalog virtualenv do innego katalogu (w systemie Linux) lub zmieniasz nazwę katalogu nadrzędnego.
źródło
Miałem ten sam problem. Problem dla mnie (na Ubuntu) polegał na tym, że nazwa mojej ścieżki zawierała
$
. Kiedy stworzyłem virtualenv poza katalogiem $ dir, działało dobrze.Dziwne.
źródło
Jednym z możliwych powodów, dla których virtualenv pip nie działa, jest to, że którykolwiek z folderów nadrzędnych miał miejsce w nazwie,
/Documents/project name/app
zmieniając jego nazwę , aby/Documents/projectName/app
rozwiązać problem.źródło
Napotkałem ten sam problem, w którym pip w venv nadal działa jako globalny pip.
Po przeszukaniu wielu stron rozumiem to w ten sposób.
1. Utwórz nowy venv przez virtualenv z opcją „--no-site-packages”
proszę zauważyć, że chociaż opcja „--no-site-packages” była domyślnie włączona od 1.7.0 w pliku doc programu virtualenv, ale okazało się, że nie działa, chyba że ustawisz ją ręcznie. Aby uzyskać czyste środowisko, zdecydowanie sugeruję włączenie tej opcji. 2. Aktywuj nowe środowisko, które utworzyłeś
Chciałbym, żeby ta odpowiedź ci pomogła!
źródło
Oto lista wszystkich opcji instalacji pip - nie znalazłem żadnej
-E
opcji ' ', być może miała ją starsza wersja. Poniżej dzielę się prostym angielskim użytkowaniem i pracąvirtualenv
dla nadchodzących użytkowników SO.Wszystko wydaje się w porządku, zaakceptuj aktywację
virtualenv
(foo
). Wszystko, co robi, to pozwala nam mieć wiele (i różne) środowisko Pythona, tj. Różne wersje Pythona, różne wersje Django lub dowolny inny pakiet Pythona - na wypadek, gdybyśmy mieli poprzednią wersję w produkcji i chcielibyśmy przetestować najnowsze wydanie Django z naszym podanie.W skrócie tworzenie i używanie (aktywowanie) środowiska wirtualnego (
virtualenv
) umożliwia uruchamianie lub testowanie naszej aplikacji lub prostych skryptów Pythona z różnymi interpreterami Pythona tj. Python 2.7 i 3.3 - może to być nowa instalacja (za pomocą--no-site-packages
opcji) lub wszystkie pakiety z istniejących / ostatnia konfiguracja (za pomocą--system-site-packages
opcji). Aby z niego skorzystać, musimy go aktywować:$ pip install django
zainstaluje go w globalnych pakietach lokacji i podobnie pobierającpip freeze
zwróci nazwy globalnych pakietów witryn.podczas gdy w katalogu venv dir (foo) wykonanie
$ source /bin/activate
aktywuje venv, tzn. teraz wszystko, co zostało zainstalowane z pip, zostanie zainstalowane tylko w wirtualnym env, a dopiero teraz pip freeze nie pokaże listy globalnych pakietów pythona. Po aktywacji:(foo)
przed$
znakiem wskazuje, że używamy wirtualnego środowiska Pythona, tj. wszystko z pip - install, freeze, uninstall będzie ograniczone do tego venv i nie będzie miało wpływu na globalną / domyślną instalację / pakiety Pythona.źródło