IT story

Python이 virtualenv 내에서 실행 중인지 확인

hot-time 2020. 4. 13. 08:20
반응형

Python이 virtualenv 내에서 실행 중인지 확인


현재 확장가 virtualenv 환경 내에서 실행 중에 지칠 수 없는가?


AFAIK는 다음과 같은 확인을하는 것입니다 sys.real_prefix.

import sys

if hasattr(sys, 'real_prefix'):
    #...

VIRTUALENV 내부 sys.prefixVIRTUALENV 공간 및 포인트 및 sys.real_prefix시스템 개수 (보통의 "진짜"접두사 포인트 /usr/usr/local또는 다른 것 등).

virtualenv 외부에 sys.real_prefix존재하지 않습니다.

VIRTUAL_ENV환경 변수를 사용하십시오 . VIRTUALENV activate쉘 펼쳐에 의해 설정 되지만 VIRTUALENV bin/(또는 Scripts) 디렉토리 에서 실행 파일을 직접 실행하여 활성화하지 않고 VIRTUALENV를 사용할 수 있습니다 . 경우이 $VIRTUAL_ENV설정되지 않습니다.


비타민 성분 pip -V(자본 V)

가상 환경을 실행할 수 있습니다.


이것은 칼 마이어의 대답에, 대한 개선입니다 . 그것은 작동 VIRTUALENV 파이썬 3과 2 및도에 대한 venv의 파이썬 3 모듈 :

import sys


def is_venv():
    return (hasattr(sys, 'real_prefix') or
            (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix))

sys.real_prefix가상 환경 커버링 venv sys.base_prefix유연성 virtualenv 커버를 확인합니다 sys.prefix.

다음과 같은 기능을 사용하십시오.

if is_venv():
    print('inside virtualenv or venv')
else:
    print('outside virtualenv or venv')

그리고 다음 전화 :

$ 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 

$VIRTUAL_ENV환경 변수를 확인하십시오 .

$VIRTUAL_ENV환경 변수는 가상 환경입니다.

>>> import os
>>> os.environ['VIRTUAL_ENV']
'/some/path/project/venv'

deactivate가상 환경 을 실행하고 나면 $VIRTUAL_ENV변수가 지워집니다. KeyError환경 변수가 설정되지 않았기 때문에 파이썬은 a를 발생 시킵니다.

>>> 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'

물론 동일한 환경 변수 검사는 Python 스크립트 외부의 셸에서 수행 할 수도 있습니다.


http://www.python.org/dev/peps/pep-0405/#specification 의 virtualenv pep에 따르면 os.environ [ 'VIRTUAL_ENV'] 대신 sys.prefix를 사용할 수 있습니다.

sys.real_prefix가 내 virtualenv에 없으며 sys.base_prefix와 동일합니다.


which python가상 환경에서 가상 환경을 가리키고 있는지 확인할 수 있습니다 .


Virtualenv 내부를 확인하려면 :

import os

if os.getenv('VIRTUAL_ENV'):
    print('Using Virtualenv')
else:
    print('Not using Virtualenv')

환경에 대한 추가 데이터를 얻을 수도 있습니다.

import sys
import os

print(f'Python Executable: {sys.executable}')
print(f'Python Version: {sys.version}')
print(f'Virtualenv: {os.getenv("VIRTUAL_ENV")}')

나는 일상적으로 여러 Anaconda 설치 가상 환경 (venv)을 사용합니다. 이 코드 스 니펫 / 예를 사용하면 venv (또는 시스템 환경)에 있는지 여부를 판별하고 스크립트에 특정 venv를 요구할 수도 있습니다.

PYTHON SCRIPT에 추가 (코드 스 니펫) :

# ----------------------------------------------------------------------------
# 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! ... ]

스크립트 실행 (예) :

$ python  webcam_cv3_v2_fps_v2c.py  -n50
    Please set the py35 { p3 | Python 3.5 } environment!

$ thee
  [Theano in Anaconda Python 2.7 venv (source activate theano-env)]

(theano-env) $ python  webcam_cv3_v2_fps_v2c.py  -n50
    Please set the py35 { p3 | Python 3.5 } environment!

(theano-env) $ tf
  [TensorFlow in Anaconda Python 2.7 venv (source activate tf-env]

(tf-env) $ python  webcam_cv3_v2_fps_v2c.py  -n50
    Please set the py35 { p3 | Python 3.5 } environment!

(tf-env) $ p2
  [Anaconda Python 2.7 venv (source activate py27)]

(py27) $ python  webcam_cv3_v2_fps_v2c.py  -n50
    Please set the py35 { p3 | Python 3.5 } environment!

(py27) $ p3
  [Anaconda Python 3.5 venv (source activate py35)]

(py35) $ python  webcam_cv3_v2_fps_v2c.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) $ sd
  [Anaconda venv deactivate (source deactivate)]

$ python  webcam_cv3_v2_fps_v2c.py  -n50
    Please set the py35 { p3 | Python 3.5 } environment!

$ ## Q.E.D.  ;-)

업데이트 : bash 스크립트에서 사용하십시오.

bash 스크립트 (예 : 특정 가상 환경에서 실행해야하는 스크립트)에서도이 방법을 사용할 수 있습니다. 예제 (bash 스크립트에 추가) :

# ----------------------------------------------------------------------------
# Excerpt from: /mnt/Vancouver/Programming/scripts/tf_tb_del.sh      ## tf_tb_del: tf_tensorboard_delete
# [bash script run on command-line: calls TensorFlow-related commands, therefore must be run in tf-env venv]

if [ $CONDA_DEFAULT_ENV ]        ## << note the spaces (important in bash)!
then
    printf  '\n\tvenv: tf-env\n'
else
    printf '\n\n\t*******************************************************************\n'
    printf '\t***  NOTE! Must run this script in tf-env virtual environment!  ***\n'
    printf '\t*******************************************************************'
    exit
fi
## [ ... snip ... ]

가장 쉬운 방법은 다음을 실행하는 것입니다. which python, virtualenv에 있으면 전역이 아닌 파이썬을 가리 킵니다.


(편집) 그 방법을 찾았습니다. 어떻게 생각하십니까? (또한 venv 기본 경로를 반환 하고 env 변수를 확인 하지 않는 readthedocs 에서도 작동합니다 ) :

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'] + '/../')

방탄은 아니지만 UNIX 환경의 경우 다음과 같은 간단한 테스트입니다.

if run("which python3").find("venv") == -1:
    # something when not executed from venv

나를 위해 잘 작동합니다. 그런 다음 기존의 일부 속성을 테스트하는 것이 더 간단하며 어쨌든 venv 디렉토리의 이름을 지정해야합니다 venv.


Windows OS에서는 다음과 같은 내용이 표시됩니다.

C:\Users\yourusername\virtualEnvName\Scripts>activate
(virtualEnvName) C:\Users\yourusername\virtualEnvName\Scripts>

괄호는 실제로 "virtualEnvName"이라는 가상 환경에 있음을 의미합니다.


잠재적 인 솔루션입니다 :

os.access(sys.executable, os.W_OK)

필자의 경우 실제로 pip로 항목을 설치할 수 있는지 감지하고 싶었습니다. 모든 경우에 적합한 솔루션은 아니지만 Python 실행 파일의 위치에 대한 쓰기 권한이 있는지 간단히 확인하십시오.

참고 : 이것은 모든 버전의 Python에서 작동하지만 True시스템 Python을 사용하여 실행하면 반환 합니다 sudo. 잠재적 사용 사례는 다음과 같습니다.

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'])

이것은 오래된 질문이지만, 위의 너무 많은 예가 지나치게 복잡합니다.

단순하게 유지 : (Windows 10의 Jupyter Notebook 또는 Python 3.7.1 터미널)


import sys
print(sys.executable)```

# example output: >> `C:\Anaconda3\envs\quantecon\python.exe`

OR 
```sys.base_prefix```

# Example output: >> 'C:\\Anaconda3\\envs\\quantecon'

이미 여기에 게시 된 훌륭한 방법이 많이 있지만 하나만 추가하면됩니다.

import site
site.getsitepackages()

pip패키지 설치된 위치를 알려줍니다 .


여기에는 여러 가지 좋은 답변이 있으며 덜 견고한 답변이 있습니다. 개요는 다음과 같습니다.

하지 않는 방법

파이썬이나 site-packages폴더 의 위치에 의존하지 마십시오 .

이러한 위치가 비표준 위치로 설정되어 있어도 실제로 가상 환경에있는 것은 아닙니다 . 사용자는 둘 이상의 Python 버전을 설치할 수 있으며 항상 원하는 위치에있는 것은 아닙니다.

다음을 보지 마십시오.

  • sys.executable
  • sys.prefix
  • pip -V
  • which python

또한,의 존재를 확인하지 않는 venv, .venv또는 envs이러한 경로 중 하나입니다. 위치가 더 고유 한 환경에서는 문제가 발생합니다. 예를 들어 Pipenv 는 해시 값을 환경 이름으로 사용합니다.

VIRTUAL_ENV 환경 변수

모두 virtualenvvenv환경 변수를 설정 $VIRTUAL_ENV하는 환경을 활성화 할 때. PEP 405를 참조하십시오 .

쉘 스크립트에서이 변수를 읽거나이 Python 코드를 사용하여 변수가 설정되어 있는지 확인할 수 있습니다.

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"))

문제는 환경이 쉘 스크립트에 의해 활성화 될 때만 작동한다는 것입니다 activate.

환경 을 활성화하지 않고 환경의 스크립트 시작할 수 있으므로 걱정되는 경우 다른 방법을 사용해야합니다.

sys.real_prefixsys.base_prefix

Virtualenv sys.prefix는 예상대로 virtualenv 내부에 설치된 Python을 가리 킵니다 .

동시에, 원래 의 값은 sys.prefix또한 새로운 속성으로 사용할 수 있습니다 sys: sys.real_prefix. 이것이 우리가 virtualenv에 있는지 감지하기 위해 사용하는 것입니다.

import sys
running_in_virtualenv = hasattr(sys, "real_prefix")

그래도 문제가 있습니다 : venv그리고 pyvenv다르게 virtualenv설정하십시오 real_prefix. 대신에 base_prefix다른 값으로 설정 되었습니다 sys.prefix.

안전을 위해 hroncok 답변의 에서 제안한대로 두 가지를 모두 확인하십시오 .

import sys

virtualenv_prefix = getattr(sys, "real_prefix", None)
venv_prefix = getattr(sys, "base_prefix", sys.prefix)

running_in_virtualenv = virtualenv_prefix or venv_prefix != sys.prefix

아나콘다

아나 코나 가상 환경을 사용하는 빅토리아 스튜어트의 답변을 확인하십시오 .

참고 URL : https://stackoverflow.com/questions/1871549/determine-if-python-is-running-inside-virtualenv

반응형