Czy można ustalić, czy bieżący skrypt działa w środowisku virtualenv?
python
virtualenv
miracle2k
źródło
źródło
Odpowiedzi:
AFAIK najbardziej niezawodnym sposobem sprawdzenia tego (i sposobem, który jest używany wewnętrznie w virtualenv i pip) jest sprawdzenie, czy istnieją
sys.real_prefix
:Wewnątrz virtualenv,
sys.prefix
wskazuje katalog virtualenv isys.real_prefix
wskazuje na „prawdziwe” prefiks systemu Pythona (często/usr
lub/usr/local
czy coś takiego).Poza virtualenv
sys.real_prefix
nie powinno istnieć.Korzystanie ze
VIRTUAL_ENV
zmiennej środowiskowej nie jest niezawodne. Jest ustawiony przezactivate
skrypt powłoki virtualenv , ale virtualenv może być używany bez aktywacji poprzez bezpośrednie uruchomienie pliku wykonywalnego z katalogubin/
(lubScripts
) virtualenv , w którym to przypadku$VIRTUAL_ENV
nie zostanie ustawiony.źródło
PYTHON_ENV=$(python -c "import sys; sys.stdout.write('1') if hasattr(sys, 'real_prefix') else sys.stdout.write('0')")
Spróbuj użyć
pip -V
(wypowiedz kapitał V)Jeśli korzystasz z wirtualnej env. pokaże ścieżkę do lokalizacji środowiska.
źródło
virtualenv
często się poruszałeś , możliwe, że to się nie powiedzie lub okłamie. Jeśli kłamie, możesz to zrobićfind /path/to/venv/ -type f -exec sed -ie "s:/old/path/to/venv:/path/to/venv:g" {} \+
. Jeśli zawiedzie (mam „złe dane marszałka”), musisz wyczyścić pliki .pycfind /path/to/venv -type f -name "*.pyc" -exec rm {} \+
(nie martw się, odbudują się automatycznie)....\lib\site-packages
w%PATH%
. W takim przypadku zwróci fałszywie dodatni wynik.Jest to poprawka do zaakceptowanej odpowiedzi Carla Meyera . Działa z virtualenv dla Python 3 i 2, a także z modułem venv w Python 3:
Sprawdzanie
sys.real_prefix
okładek virtualenv, równość niepustychsys.base_prefix
zsys.prefix
coverami venv.Rozważmy skrypt, który używa takiej funkcji:
I następujące wywołanie:
źródło
def is_venv(): return hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefix
. Tylko mówię'.pipenv
utworzonych środowiskach wirtualnych.Sprawdź
$VIRTUAL_ENV
zmienną środowiskową.$VIRTUAL_ENV
Zmienna zawiera katalog środowisku wirtualnym, gdy w aktywnym środowisku wirtualnym.Po uruchomieniu
deactivate
/ opuszczeniu środowiska wirtualnego$VIRTUAL_ENV
zmienna zostanie wyczyszczona / pusta. Python podniesie,KeyError
ponieważ zmienna środowiskowa została rozbrojona.Te same kontrole zmiennych środowiskowych można oczywiście również wykonać poza skryptem Pythona w powłoce.
źródło
virtualenv
virtualenv, jak ivenv
virtualenv.Według virtualenv pep na http://www.python.org/dev/peps/pep-0405/#specification możesz po prostu użyć sys.prefix zamiast os.environ ['VIRTUAL_ENV'].
sys.real_prefix nie istnieje w mojej virtualenv i to samo z sys.base_prefix.
źródło
sys.real_prefix
.env |grep VIRTUAL_ENV |wc -l
która zwróci 1 jeśli w venv lub 0 jeśli nie.[[ -n $VIRTUAL_ENV ]] && echo virtualenv
lub w[[ -z $VIRTUAL_ENV ]] && echo not virtualenv
zależności od potrzeb.Aby sprawdzić, czy Twój wirtualny Virtualenv:
Możesz także uzyskać więcej danych o swoim środowisku:
źródło
Jest tu wiele dobrych odpowiedzi i niektóre mniej niezawodne. Oto przegląd.
Jak tego nie robić?
Nie polegaj na lokalizacji Pythona ani
site-packages
folderu.Jeśli są ustawione na niestandardowe lokalizacje, nie oznacza to, że faktycznie znajdujesz się w środowisku wirtualnym. Użytkownicy mogą mieć zainstalowaną więcej niż jedną wersję Pythona i nie zawsze są tam, gdzie się ich spodziewasz.
Unikaj patrzenia na:
sys.executable
sys.prefix
pip -V
which python
Nie należy również sprawdzić pod kątem obecności
venv
,.venv
anienvs
w żadnym z tych ścieżek. To zepsuje się w środowiskach o bardziej unikalnej lokalizacji. Na przykład Pipenv używa wartości skrótu jako nazwy swoich środowisk.VIRTUAL_ENV
Zmienna środowiskowaZarówno
virtualenv
ivenv
ustaw zmienną środowiskową$VIRTUAL_ENV
podczas aktywacji środowiska. Zobacz PEP 405 .Możesz odczytać tę zmienną w skryptach powłoki lub użyć tego kodu Python, aby ustalić, czy jest ustawiona.
Problem polega na tym, że działa to tylko wtedy, gdy środowisko jest aktywowane przez
activate
skrypt powłoki.Możesz uruchamiać skrypty środowiska bez aktywowania środowiska , więc jeśli jest to problem, musisz użyć innej metody.
sys.base_prefix
virtualenv
,venv
ipyvenv
wskażsys.prefix
Python zainstalowany wewnątrz virtualenv, jak można się spodziewać.Jednocześnie udostępniana jest również pierwotna wartość parametru .
sys.prefix
sys.base_prefix
Możemy to wykorzystać do wykrycia, czy jesteśmy wirtualni.
Fallback:
sys.real_prefix
Teraz uważaj,
virtualenv
zanim wersja 20 nie ustawiła się,sys.base_prefix
ale ustawiła sięsys.real_prefix
.Aby być bezpiecznym, sprawdź oba, jak sugeruje odpowiedź hroncok :
Anakonda
Jeśli używasz środowisk wirtualnych Anaconda, sprawdź odpowiedź Victorii Stuart .
źródło
running_in_virtualenv = sys.*base_*prefix != sys.prefix
if hasattr(sys, 'real_prefix'):
teście, który już nie działał.Możesz to zrobić
which python
i sprawdzić, czy wskazuje na to w wirtualnej env.źródło
which
nie jest domyślnie dostępny w systemie Windows. Możeszwhere
zamiast tego użyć w systemie Windows lub zatrudnić które jednostki . Lub spójrz nasys.executable
. Ale wciąż istnieją lepsze metody.Rutynowo korzystam z kilku środowisk wirtualnych zainstalowanych przez Anacondę (venv). Ten fragment kodu / przykłady pozwala określić, czy jesteś w venv (lub środowisku systemowym), a także wymagać określonej venv dla skryptu.
Dodaj do skryptu Python (fragment kodu):
Przykład:
Aktualizacja 1 - użyj w skryptach bash:
Możesz także użyć tego podejścia w skryptach bash (np. Tych, które muszą działać w określonym środowisku wirtualnym). Przykład (dodany do skryptu bash):
Aktualizacja 2 [lis 2019]
Od czasu mojego oryginalnego postu przeszedłem z Anaconda venv (a sam Python ewoluował w środowiskach wirtualnych viz-a-viz ).
Ponownie sprawdzając ten problem, oto zaktualizowany kod Pythona, który można wstawić w celu przetestowania działania w określonym środowisku wirtualnym Python (venv).
Oto kod wyjaśniający.
źródło
Najprościej jest po prostu uruchomić:
which python
jeśli jesteś w virtualenv, wskaże on pytona zamiast globalnegoźródło
(edytowane) Znalazłem w ten sposób, co o tym sądzisz? (zwraca również ścieżkę bazową venv i działa nawet dla readthedocs, w których nie sprawdza się zmiennej env ):
źródło
Istnieje już wiele świetnych metod, ale wystarczy dodać jeszcze jedną:
informuje, gdzie
pip
zainstalowano pakiety.źródło
site.getsitepackages()
wyprowadza katalog, który nie jest systemowy, możesz wywnioskować, że jesteś w środowisku wirtualnym.virtualenv
.venv
używasz.To nie jest kuloodporny, ale dla środowisk UNIX prosty test jak
działa dla mnie świetnie. To prostsze niż testowanie istnienia jakiegoś atrybutu, w każdym razie powinieneś nazwać swój katalog venv
venv
.źródło
W systemie operacyjnym Windows widać coś takiego:
Nawiasy oznaczają, że faktycznie znajdujesz się w środowisku wirtualnym o nazwie „virtualEnvName”.
źródło
Potencjalnym rozwiązaniem jest:
W moim przypadku naprawdę chciałem po prostu sprawdzić, czy mogę zainstalować elementy za pomocą pipa w takiej postaci, w jakiej są. Chociaż może to nie być właściwe rozwiązanie dla wszystkich przypadków, rozważ po prostu sprawdzenie, czy masz uprawnienia do zapisu dla lokalizacji pliku wykonywalnego Python.
Uwaga: działa to we wszystkich wersjach Pythona, ale zwraca również,
True
jeśli uruchomisz systemowy Pythonsudo
. Oto potencjalny przypadek użycia:źródło
To stare pytanie, ale zbyt wiele powyższych przykładów jest zbyt skomplikowanych.
Keep It Simple: (w Jupyter Notebook lub Python 3.7.1 terminal w systemie Windows 10)
źródło
envs
na tej ścieżce, przestanie ona działać po przejściu z anakondy dovirtualenv
lubpipenv
.