Geçerli betiğin bir sanal ortam içinde çalışıp çalışmadığını belirlemek mümkün müdür?
Geçerli betiğin bir sanal ortam içinde çalışıp çalışmadığını belirlemek mümkün müdür?
Yanıtlar:
AFAIK bunu kontrol etmenin en güvenilir yolu (ve sanal olarak sanal olarak ve pip'te dahili olarak kullanılan yöntem) aşağıdakilerin varlığını kontrol etmektir sys.real_prefix
:
import sys
if hasattr(sys, 'real_prefix'):
#...
Bir virtualenv içinde, sys.prefix
Virtualenv dizinine noktaları ve sys.real_prefix
sistemin Python (genellikle "gerçek" öneki işaret /usr
ya /usr/local
ya da bazı tür).
Bir virtualenv dışında, sys.real_prefix
olmamalıdır.
VIRTUAL_ENV
Ortam değişkenini kullanmak güvenilir değildir. Virtualenv activate
kabuk betiği tarafından ayarlanır , ancak virtualenv'in bin/
(veya Scripts
) dizininden bir yürütülebilir dosyayı doğrudan çalıştırarak etkinleştirilmeden bir virtualenv kullanılabilir , bu durumda $VIRTUAL_ENV
ayarlanmaz.
PYTHON_ENV=$(python -c "import sys; sys.stdout.write('1') if hasattr(sys, 'real_prefix') else sys.stdout.write('0')")
Kullanmayı deneyin pip -V
(büyük harf V'ye dikkat edin)
Sanal env çalıştırıyorsanız. env.'nin konumuna giden yolu gösterecektir.
virtualenv
Etrafında çok hareket ettiysen , bu başarısız olabilir veya sana yalan söyleyebilir. Eğer yalan söylüyorsa, yapabilirsin find /path/to/venv/ -type f -exec sed -ie "s:/old/path/to/venv:/path/to/venv:g" {} \+
. Başarısız olursa ("kötü mareşal verilerim var") .pyc dosyalarını silmeniz gerekir find /path/to/venv -type f -name "*.pyc" -exec rm {} \+
(endişelenmeyin, otomatik olarak yeniden oluşturulurlar).
...\lib\site-packages
içinde %PATH%
. Bu durumda yanlış bir pozitif geri dönecektir.
Bu, Carl Meyer tarafından kabul edilen cevabın iyileştirilmesidir . Python 3 ve 2 ve ayrıca Python 3'teki venv modülü için virtualenv ile çalışır :
import sys
def is_venv():
return (hasattr(sys, 'real_prefix') or
(hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix))
Onay sys.real_prefix
kapakları Virtualenv, boş olmayan eşitliği sys.base_prefix
ile sys.prefix
kapaklar venv.
Bu işlevi kullanan bir komut dosyası düşünün:
if is_venv():
print('inside virtualenv or venv')
else:
print('outside virtualenv or venv')
Ve aşağıdaki çağrı:
$ python2 test.py
outside virtualenv or venv
$ python3 test.py
outside virtualenv or venv
$ python2 -m virtualenv virtualenv2
...
$ . virtualenv2/bin/activate
(virtualenv2) $ python test.py
inside virtualenv or venv
(virtualenv2) $ deactivate
$ python3 -m virtualenv virtualenv3
...
$ . virtualenv3/bin/activate
(virtualenv3) $ python test.py
inside virtualenv or venv
(virtualenv3) $ deactivate
$ python3 -m venv venv3
$ . venv3/bin/activate
(venv3) $ python test.py
inside virtualenv or venv
(venv3) $ deactivate
def is_venv(): return hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefix
. Sadece söylüyorum'.
pipenv
oluşturulan sanal ortamlarla çalışmıyor gibi görünüyor .
$VIRTUAL_ENV
Ortam değişkenini kontrol edin .
$VIRTUAL_ENV
Ortam değişkeni aktif sanal ortamda sanal ortamın dizinini zaman içerir.
>>> import os
>>> os.environ['VIRTUAL_ENV']
'/some/path/project/venv'
deactivate
Sanal ortamı çalıştırdığınızda / bıraktığınızda, $VIRTUAL_ENV
değişken silinir / boşaltılır. Python KeyError
, ortam değişkeni ayarlanmadığı için bir yükseltecektir .
>>> import os
>>> os.environ['VIRTUAL_ENV']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 678, in __getitem__
raise KeyError(key) from None
KeyError: 'VIRTUAL_ENV'
Bu aynı ortam değişkeni kontrolleri elbette Python betiğinin dışında kabukta da yapılabilir.
virtualenv
sanal ekran hem de bir sanal ekran için çalışır venv
.
En Virtualenv pep göre http://www.python.org/dev/peps/pep-0405/#specification yapmak yerine [ 'VIRTUAL_ENV'] os.environ sys.prefix kullanabilirsiniz.
sys.real_prefix sanal arayüzümde mevcut değil ve sys.base_prefix ile aynı.
sys.real_prefix
.
env |grep VIRTUAL_ENV |wc -l
bash'den tespit etmenin güzel bir yolu çalıştırmaktır: bir venv ise 1 veya değilse 0 döndürür.
[[ -n $VIRTUAL_ENV ]] && echo virtualenv
veya [[ -z $VIRTUAL_ENV ]] && echo not virtualenv
ihtiyaçlarınıza bağlı olarak kullanabilirsiniz .
İçinizdeki Virtualenv'in olup olmadığını kontrol etmek için:
import os
if os.getenv('VIRTUAL_ENV'):
print('Using Virtualenv')
else:
print('Not using Virtualenv')
Ayrıca ortamınız hakkında daha fazla veri alabilirsiniz:
import sys
import os
print(f'Python Executable: {sys.executable}')
print(f'Python Version: {sys.version}')
print(f'Virtualenv: {os.getenv("VIRTUAL_ENV")}')
Burada çok sayıda iyi yanıt var ve daha az sağlam cevaplar var. İşte bir genel bakış.
Python'un veya site-packages
klasörün konumuna güvenmeyin .
Bu standart dışı konumlara ayarlanır, bu mu değil bir sanal ortamda aslında olduğun anlamına. Kullanıcıların birden fazla Python sürümü yüklü olabilir ve bunlar her zaman beklediğiniz yerde değildir.
Şuna bakmaktan kaçının:
sys.executable
sys.prefix
pip -V
which python
Ayrıca mevcut olup olmadığını kontrol yok venv
, .venv
ya da envs
bu yolların herhangi birinde. Bu, daha benzersiz bir konuma sahip ortamlar için kırılacaktır. Örneğin
Pipenv , ortamlarının adı olarak karma değerleri kullanır.
VIRTUAL_ENV
Çevre değişkeniHem virtualenv
ve venv
ortam değişkeni ayarlamak $VIRTUAL_ENV
bir ortam aktive olduğunda. Bkz. PEP 405 .
Bu değişkeni kabuk komut dosyalarında okuyabilir veya ayarlanıp ayarlanmadığını belirlemek için bu Python kodunu kullanabilirsiniz.
import os
running_in_virtualenv = "VIRTUAL_ENV" in os.environ
# alternative ways to write this, also supporting the case where
# the variable is set but contains an empty string to indicate
# 'not in a virtual environment':
running_in_virtualenv = bool(os.environ.get("VIRTUAL_ENV"))
running_in_virtualenv = bool(os.getenv("VIRTUAL_ENV"))
Sorun şu ki, bu yalnızca ortam kabuk betiği tarafından etkinleştirildiğinde çalışır activate
.
Ortamı etkinleştirmeden ortamın komut dosyalarını başlatabilirsiniz , bu nedenle endişe ediyorsanız farklı bir yöntem kullanmanız gerekir.
sys.base_prefix
virtualenv
, venv
Ve pyvenv
nokta sys.prefix
beklediğiniz gibi Python için içeri virtualenv kurulu.
Aynı zamanda, orijinal değeri sys.prefix
olarak da kullanılabilir sys.base_prefix
.
Bunu bir sanal ortamda olup olmadığımızı tespit etmek için kullanabiliriz.
import sys
# note: Python versions before 3.3 don't have sys.base_prefix
# if you're not in virtual environment
running_in_virtualenv = sys.prefix != sys.base_prefix
sys.real_prefix
Şimdi dikkat edin, virtualenv
sürüm 20 başlamadan önce yerine sys.base_prefix
ayarlandı sys.real_prefix
.
Güvende olmak için, ikisini de hroncok'un cevabında önerildiği gibi kontrol edin :
import sys
real_prefix = getattr(sys, "real_prefix", None)
base_prefix = getattr(sys, "base_prefix", sys.prefix)
running_in_virtualenv = (base_prefix or real_prefix) != sys.prefix
Anaconda sanal ortamlarını kullanıyorsanız, Victoria Stuart'ın cevabını kontrol edin .
running_in_virtualenv = sys.*base_*prefix != sys.prefix
if hasattr(sys, 'real_prefix'):
işe yaramayan teste güveniyordum .
Sen yapabilir which python
ve onun sanal env'deki birine işaret olmadığını görmek.
which
Windows'ta varsayılan olarak kullanılamaz. Bunun where
yerine Windows'ta kullanabilir veya hangi taşıtları kullanabilirsiniz . Veya bakın sys.executable
. Ama yine de, daha iyi yöntemler var.
Ben rutin olarak birkaç Anaconda yüklü sanal ortam (venv) kullanıyorum. Bu kod snippet'i / örnekleri, bir venv'de (veya sistem ortamınızda) olup olmadığınızı belirlemenizi ve ayrıca komut dosyanız için belirli bir venv gerektirmenizi sağlar.
Python komut dosyasına ekle (kod snippet'i):
# ----------------------------------------------------------------------------
# Want script to run in Python 3.5 (has required installed OpenCV, imutils, ... packages):
import os
# First, see if we are in a conda venv { py27: Python 2.7 | py35: Python 3.5 | tf: TensorFlow | thee : Theano }
try:
os.environ["CONDA_DEFAULT_ENV"]
except KeyError:
print("\tPlease set the py35 { p3 | Python 3.5 } environment!\n")
exit()
# If we are in a conda venv, require the p3 venv:
if os.environ['CONDA_DEFAULT_ENV'] != "py35":
print("\tPlease set the py35 { p3 | Python 3.5 } environment!\n")
exit()
# See also:
# Python: Determine if running inside virtualenv
# http://stackoverflow.com/questions/1871549/python-determine-if-running-inside-virtualenv
# [ ... SNIP! ... ]
Misal:
$ p2
[Anaconda Python 2.7 venv (source activate py27)]
(py27) $ python webcam_.py
Please set the py35 { p3 | Python 3.5 } environment!
(py27) $ p3
[Anaconda Python 3.5 venv (source activate py35)]
(py35) $ python webcam.py -n50
current env: py35
processing (live): found 2 faces and 4 eyes in this frame
threaded OpenCV implementation
num_frames: 50
webcam -- approx. FPS: 18.59
Found 2 faces and 4 eyes!
(py35) $
Güncelleme 1 - bash komut dosyalarında kullanın:
Bu yaklaşımı bash komut dosyalarında da kullanabilirsiniz (örneğin, belirli bir sanal ortamda çalıştırılması gerekenler). Örnek (bash betiğine eklendi):
if [ $CONDA_DEFAULT_ENV ] ## << note the spaces (important in BASH)!
then
printf 'venv: operating in tf-env, proceed ...'
else
printf 'Note: must run this script in tf-env venv'
exit
fi
Güncelleme 2 [Kasım 2019]
Orijinal yazımdan beri Anaconda venv'den taşındım (ve Python'un kendisi viz-a- viz'i geliştirdi sanal ortamlarını geliştirdi).
Bu sorunu yeniden inceleyerek, belirli bir Python sanal ortamında (venv) çalıştığınızı test etmek için ekleyebileceğiniz bazı güncellenmiş Python kodları.
import os, re
try:
if re.search('py37', os.environ['VIRTUAL_ENV']):
pass
except KeyError:
print("\n\tPlease set the Python3 venv [alias: p3]!\n")
exit()
İşte bazı açıklayıcı kod.
[victoria@victoria ~]$ date; python --version
Thu 14 Nov 2019 11:27:02 AM PST
Python 3.8.0
[victoria@victoria ~]$ python
Python 3.8.0 (default, Oct 23 2019, 18:51:26)
[GCC 9.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, re
>>> re.search('py37', os.environ['VIRTUAL_ENV'])
<re.Match object; span=(20, 24), match='py37'>
>>> try:
... if re.search('py37', os.environ['VIRTUAL_ENV']):
... print('\n\tOperating in Python3 venv, please proceed! :-)')
... except KeyError:
... print("\n\tPlease set the Python3 venv [alias: p3]!\n")
...
Please set the Python3 venv [alias: p3]!
>>> [Ctrl-d]
now exiting EditableBufferInteractiveConsole...
[victoria@victoria ~]$ p3
[Python 3.7 venv (source activate py37)]
(py37) [victoria@victoria ~]$ python --version
Python 3.8.0
(py37) [victoria@victoria ~]$ env | grep -i virtual
VIRTUAL_ENV=/home/victoria/venv/py37
(py37) [victoria@victoria ~]$ python
Python 3.8.0 (default, Oct 23 2019, 18:51:26)
[GCC 9.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, re
>>> try:
... if re.search('py37', os.environ['VIRTUAL_ENV']):
... print('\n\tOperating in Python3 venv, please proceed! :-)')
... except KeyError:
... print("\n\tPlease set the Python3 venv [alias: p3]!\n")
...
Operating in Python3 venv, please proceed! :-)
>>>
En kolay yol sadece koşmaktır: which python
Eğer bir sanal ortamdaysanız, küresel olan yerine pythonunu gösterecektir.
Bu şekilde buldum, ne düşünüyorsun? (ayrıca venv taban yolunu döndürür ve env değişkeninin kontrol edilmediği okumalar için bile çalışır ):
import os
import sys
from distutils.sysconfig import get_config_vars
def get_venv_basedir():
"""Returns the base directory of the virtualenv, useful to read configuration and plugins"""
exec_prefix = get_config_vars()['exec_prefix']
if hasattr(sys, 'real_prefix') is False or exec_prefix.startswith(sys.real_prefix):
raise EnvironmentError('You must be in a virtual environment')
return os.path.abspath(get_config_vars()['exec_prefix'] + '/../')
Burada zaten yayınlanan birçok harika yöntem var, ancak sadece bir tane daha ekliyoruz:
import site
site.getsitepackages()
pip
paketleri nereye yüklediğinizi söyler .
site.getsitepackages()
Sistem dizini olmayan bir dizin çıkarırsa , sanal bir ortamda olduğunuzu çıkarabilirsiniz.
virtualenv
.
venv
kullandığınızı söylemenize yardımcı olabileceğini kabul ediyorum.
Kurşun geçirmez değil, UNIX ortamları için basit bir test
if run("which python3").find("venv") == -1:
# something when not executed from venv
benim için harika çalışıyor. Daha sonra bazı özniteliklerin varlığını test etmek daha kolaydır ve yine de venv dizininizi adlandırmalısınız venv
.
Windows işletim sisteminde böyle bir şey görürsünüz:
C:\Users\yourusername\virtualEnvName\Scripts>activate
(virtualEnvName) C:\Users\yourusername\virtualEnvName\Scripts>
Parantez, aslında "virtualEnvName" adlı sanal ortamda olduğunuz anlamına gelir.
Bir potansiyel çözüm:
os.access(sys.executable, os.W_OK)
Benim durumumda gerçekten pip ile öğeleri olduğu gibi yükleyebilir miyim tespit etmek istedim. Tüm durumlar için doğru çözüm olmayabilir, ancak Python yürütülebilir dosyasının konumu için yazma izinlerine sahip olup olmadığınızı kontrol etmeyi düşünün.
Not: Bu, Python'un tüm sürümlerinde çalışır, ancak True
sistemi Python ile çalıştırırsanız da geri döner sudo
. Potansiyel bir kullanım örneği:
import os, sys
can_install_pip_packages = os.access(sys.executable, os.W_OK)
if can_install_pip_packages:
import pip
pip.main(['install', 'mypackage'])
Bu eski bir sorudur, ancak yukarıdaki çok fazla örnek aşırı karmaşıktır.
Basit Olsun: (Windows 10'da Jupyter Notebook veya Python 3.7.1 terminalinde)
import sys
print(sys.executable)```
# example output: >> `C:\Anaconda3\envs\quantecon\python.exe`
OR
```sys.base_prefix```
# Example output: >> 'C:\\Anaconda3\\envs\\quantecon'
envs
yoldaki varlığını kontrol etmek için mantık eklerseniz , anaconda'dan virtualenv
veya 'ya geçtiğinizde bu çalışma durur pipenv
.