source

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

gigabyte 2022. 10. 29. 10:00
반응형

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

현재 스크립트가 Virtualenv 환경 내에서 실행되고 있는지 확인할 수 있습니까?

할 수 있는 가장 은 '아까부터'가 아니라 '아까부터'인지 확인하는 입니다.sys.prefix == sys.base_prefix동일하면 가상환경이 아니고 동일하면 가상환경이 아닙니다. 에서는, 「 」sys.prefix 있습니다.또, 「가상 환경」이라고 하는 것도 있습니다.sys.base_prefix입니다.virtualenv는 Python의 프리픽스입니다.

3 에 、 Python 3 stdlib 、 Python 3 stdlib python python python python python python python python python python python python python python python python python python python python python python python python python python python python pythonvenv 최근 ★★★★★★★★★★★★★★에 대해서는,virtualenv(20일) 의 " " "virtualenvsys.real_prefixsys.base_prefix (그리고)sys.real_prefix하지 않음) 및 3에서는 Python 3.3이 존재하지 않습니다.sys.base_prefix존재하지 않았습니다.따라서 이러한 모든 경우를 처리하는 완전히 견고한 검사는 다음과 같습니다.

import sys

def get_base_prefix_compat():
    """Get base/real prefix, or sys.prefix if there is none."""
    return getattr(sys, "base_prefix", None) or getattr(sys, "real_prefix", None) or sys.prefix

def in_virtualenv():
    return get_base_prefix_compat() != sys.prefix

및 Python 에만 이 있는 virtualenv 라고 치환할 수 .get_base_prefix_compat()sys.base_prefix.

「 」의 VIRTUAL_ENV환경변수를 신뢰할 수 없습니다. virtualenv에 됩니다.activate는 virtualenv의virtualenv에서 직접 으로써 활성화 없이 할 수 .bin/ (오류)Scripts 「」( 「」)$VIRTUAL_ENV설정되지 않습니다.를 셸에서 되어 있는 직접 .이 virtualenv Python은 virtualenv Python을 활성화합니다.이 경우$VIRTUAL_ENV가상환경에서 실제로 실행되지 않는 Python 프로세스로 설정할 수 있습니다.

도 한번 써보세요.pip -V V림림 v v) V)

가상 환경을 실행하는 경우 환경 위치 경로가 표시됩니다.

이것은 Carl Meyer에 의해 받아들여진 답변의 개선이다.Python 3 및 2의 virtualenv와 함께 작동하며 Python 3의 venv 모듈에서도 작동합니다.

import sys


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

sys.real_prefix에서는 virtualenv에는 공백이 .이것은, 공백이 없는 것과 동등합니다.sys.base_prefixsys.prefixvenv.venv에 대해 합니다.

다음과 같은 함수를 사용하는 스크립트를 생각해 보겠습니다.

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이치노이 Python Python을 .KeyError환경 변수가 설정 해제되었기 때문입니다.

>>> 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 스크립트 외부의 셸에서도 실행할 수 있습니다.

여기에는 좋은 답변이 여러 개 있고, 그렇지 않은 답변도 몇 개 있습니다.여기 개요가 있습니다.

하지 않는 방법

Python의 .site-packages더입니니다다

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

다음 항목을 참조하지 마십시오.

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

also, 음, 음, 음, 음, 음, 음, 음, 음, ,, also, also, also, also, also, also, also, also, also, also, also,venv,.venv ★★★★★★★★★★★★★★★★★」envs이 길들 중 어느 쪽으로든요이것은, 보다 독자적인 로케이션을 가지는 환경에 영향을 줍니다.를 들어 Pipenv는 해시 값을 환경의 이름으로 사용합니다.

VIRTUAL_ENV

다.virtualenv ★★★★★★★★★★★★★★★★★」venv 변수를 $VIRTUAL_ENV환경을 활성화할 때 사용합니다.「PE 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.base_prefix

virtualenv,venv ★★★★★★★★★★★★★★★★★」pyvenvsys.prefix파이썬을 사용하다

동시에, 의 원래 가치는sys.prefix또, 로도 이용할 수 있습니다.sys.base_prefix.

이를 통해 가상 환경에 있는지 여부를 감지할 수 있습니다.

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

하세요,아,아,아.virtualenv이 설정되지 않은 버전 20이 설정되지 않은 sys.base_prefix하지만 그것은 정해졌다sys.real_prefix★★★★★★ 。

따라서 안전을 위해 hroncok의 답변에 제시된 바와 같이 둘 다 확인하십시오.

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 가상 환경을 사용하는 경우 Victoria Stuart의 답변을 확인하십시오.

http://www.python.org/dev/peps/pep-0405/ #의 virtualenv pep 사양에 따르면 사용만 하면 됩니다.sys.prefix, ★★★★★★★★★★★★★★★★」os.environ['VIRTUAL_ENV'].

sys.real_prefix하지 않으며, 가상 환경에서도 마찬가지입니다.또한sys.base_prefix.

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

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

  • 2019년 11월 갱신(첨부).

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

Python 스크립트에 추가(코드 스니펫):

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

예:

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

업데이트 1 - bash 스크립트에서 사용:

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

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

업데이트 2 [2019년 11월]

  • 간단하게 말하면, Matt의 답변(https://stackoverflow.com/a/51245168/1904943)이 마음에 듭니다.

원래 투고 후 Anaconda venv에서 넘어왔습니다(Python 자체는 viz-a-viz 가상 환경을 진화시켰습니다).

이 문제를 다시 살펴보면, 다음은 특정 Python 가상 환경(venv)에서 작동 중인지 테스트하기 위해 삽입할 수 있는 업데이트된 Python 코드입니다.

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

여기 몇 가지 설명 코드가 있습니다.

[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!  :-)
>>> 

은 그냥입니다.which python onevirtualenv가

(편집) 이렇게 찾았습니다.어떻게 생각하십니까? (venv base path를 반환하고 env 변수를 체크하지 않는 readhedoc에서도 동작합니다)

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

여기에는 이미 많은 훌륭한 방법이 게시되어 있지만, 하나 더 추가될 뿐입니다.

import site
site.getsitepackages()

를 주다pip패키지를 인스톨 합니다.

방탄은 아니지만 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'])

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

반응형