Python 스크립트로 virtualenv 활성화


91

Python 스크립트에서 virtualenv 인스턴스를 활성화하고 싶습니다.

나는 그것이 매우 쉽다는 것을 알고 있지만, 내가 본 모든 예제는 그것을 사용하여 env 내에서 명령을 실행 한 다음 하위 프로세스를 닫습니다.

bin / activate와 같은 방식으로 virtualenv를 활성화하고 쉘로 돌아가고 싶습니다.

이 같은:

$me: my-script.py -d env-name
$(env-name)me:

이것이 가능한가?

관련된:

virtualenv›스크립트에서 환경 호출

답변:


88

virtualenv에서 Python 하위 프로세스를 실행하려면 virtualenv의 / bin / 디렉토리에있는 Python 인터프리터를 사용하여 스크립트를 실행하면됩니다.

import subprocess

# Path to a Python interpreter that runs any Python script
# under the virtualenv /path/to/virtualenv/
python_bin = "/path/to/virtualenv/bin/python"

# Path to the script that must run under the virtualenv
script_file = "must/run/under/virtualenv/script.py"

subprocess.Popen([python_bin, script_file])

그러나 하위 프로세스 대신 현재 Python 인터프리터에서 virtualenv를 활성화하려면 다음 activate_this.py스크립트를 사용할 수 있습니다 .

# Doing execfile() on this file will alter the current interpreter's
# environment so you can import libraries in the virtualenv
activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

execfile(activate_this_file, dict(__file__=activate_this_file))

1
//,이 답변의 첫 번째 코드 블록의 마지막 줄은 다음과 같이 읽혀서는 안됩니다. subprocess.Popen([venv_python_file, script_file])?
Nathan Basanese

//, 또한 script_file임의의 위치에서 를 실행할 수있는 방법이 virtualenv있습니까? 아니면 디렉토리 에 있어야 합니까?
Nathan Basanese

오류를 확인해 주셔서 감사합니다. 두 번째 질문 script_file에 관해서는 virtualenv 디렉토리에있을 필요가 없으며 어디에나있을 수 있습니다.
Lie Ryan

두 번째 옵션을 사용하는 경우 가상 환경을 비활성화하려면 어떻게해야합니까?
falsePockets apr

@falsePockets : XY 문제 , 왜 그렇게하고 싶습니까?
거짓말 라이언

42

virtualenv의 인터프리터에서 스크립트를 실행하는 가장 간단한 솔루션은 스크립트 시작 부분에서 기본 shebang 줄을 virtualenv의 인터프리터 경로로 바꾸는 것입니다.

#!/path/to/project/venv/bin/python

스크립트를 실행 가능하게 만듭니다.

chmod u+x script.py

스크립트를 실행하십시오.

./script.py

짜잔!


2
우아함을 위해 +1. 윈도우에서 이것은 cygwin 또는 msys와 같은 shebang 라인을 이해하는 posix 호환 환경이 필요합니다
qneill

1
Python 3.6.3 및 Windows 10에서 작동합니다!
toonarmycaptain

원래 질문을 오해했을 수도 있습니다. 그는 스크립트로 가상 환경을 활성화하고 활성화 된 환경으로 셸로 돌아 가려고합니다. 내 대답은 가상 환경에서 스크립트를 실행하지만 반환 된 셸은 환경을 유지하지 않습니다. 현대의 솔루션은 virtualenvwrapper : virtualenvwrapper.readthedocs.io/en/latest/# 입니다. 이를 통해 다른 가상 환경을 활성화하고 전환 할 수 있습니다.
nafooesi

20

네, 문제는 간단하지 않지만 해결책은 있습니다.

먼저 "source"명령을 래핑하는 셸 스크립트를 만들어야했습니다. "." 대신 Bash 스크립트의 소스보다 사용하는 것이 낫다는 것을 읽었 기 때문입니다.

#!/bin/bash
. /path/to/env/bin/activate

그런 다음 Python 스크립트에서 간단히 다음과 같이 할 수 있습니다.

import os
os.system('/bin/bash --rcfile /path/to/myscript.sh')

모든 트릭은 --rcfile논쟁에 있습니다.

Python 인터프리터가 종료되면 활성화 된 환경의 현재 셸을 그대로 둡니다.

승리!


3
정말 이해가 안 돼요. 그냥 그렇게하지 않는 이유 : os.system('/bin/bash --rcfile path/to/env/activate') bash 인스턴스가 시작되면 .bashrc를 --rcfile의 인수로 사용합니다. 따라서 rcfile이 활성화 파일임을 지정하십시오. 아니요?
Depado 2013-08-03

@Depado 방금 귀하의 솔루션을 시도했으며 이것은 파이썬 내에서 쉘을 활성화합니다. 적어도 내가 껍질에서 그것을 시도 할 때. >>> os.system ( '/ bin / bash --rcfile / var / envs / test / bin / activate') (테스트) tcraig @ tallis-desktop : ~ $ (테스트) tcraig @ tallis-desktop : ~ $ ls -l 총 706288
Trenton

아마도 이것은 스크립트에서 작동합니다. 이 기술의 유일한 불편한 점은 ~ / .bashrc에있는 모든 별칭과 모든 것을 얻지 못한다는 것입니다. 하지만 괜찮습니다. 예를 들어 "ls"명령에는 색상이 없습니다. 그러나 모든 것이 나를 위해 작동합니다. 나가고 싶을 때 Ctrl + D
Depado 2013-08-09

7
"파이썬 인터프리터가 종료되면 활성화 된 환경에 현재 쉘을 남겨 둡니다."무엇? 완전히 새로운 쉘을 하위 프로세스로 생성하고 완료 될 때까지 기다립니다.
Kos

내 저장소에 더 많은 새 파일을 생성하지 않고 현재 bash 구성을 복제하기 위해 다음과 같이했습니다.cat ~/.bashrc env/bin/activate > env/bin/activate2 && /bin/bash --rcfile env/bin/activate2
WhyWhat

17

공식 Virtualenv 문서 에 따라 다른 Python 환경을 실행하려면 명령 줄에서 실행 가능한 Python 바이너리의 전체 경로를 지정할 수 있습니다 (이전에 virtualenv를 활성화 할 필요 없음).

/path/to/virtualenv/bin/python

virtualenv를 사용하여 명령 줄에서 스크립트를 호출하려는 경우에도 동일하게 적용됩니다. 전에 활성화 할 필요가 없습니다.

me$ /path/to/virtualenv/bin/python myscript.py

Windows 환경에서도 동일합니다 (명령 줄이든 스크립트이든) :

> \path\to\env\Scripts\python.exe myscript.py

2
질문 : Python 스크립트로 virtualenv 활성화 (Shell이 ​​아님)
Zaheer

3
예, 제 요점은 이전에 콘솔이나 스크립트에서 활성화 할 필요없이 가상 환경에서 파이썬 런타임을 호출 할 수 있다는 것입니다. 답을 명확히하겠습니다, 감사합니다!
Mariano Ruiz

맙소사! 나는 그것에 대해 생각하지 않았다. 이것은 나를 위해 일한 유일한 솔루션입니다 :). 이제 php에서 파이썬 스크립트를 실행할 때 "path / to / virtualenv / bin / python mypythonscript.py"를 사용하고 있습니다.
Zaheer

6

나를 위해 작동하는 간단한 솔루션입니다. 기본적으로 쓸모없는 단계를 수행하는 Bash 스크립트가 필요한 이유를 모르겠습니다 (내가 틀렸습니까?)

import os
os.system('/bin/bash  --rcfile flask/bin/activate')

기본적으로 필요한 것을 수행합니다.

[hellsing@silence Foundation]$ python2.7 pythonvenv.py
(flask)[hellsing@silence Foundation]$

그런 다음 가상 환경을 비활성화하는 대신 Ctrl+ D또는 종료 만하면 됩니다. 그게 가능한 해결책입니까, 아니면 당신이 원했던 것이 아닌가요?


2

자식 프로세스 환경은 더 이상 존재하지 않는 순간 손실되며 환경 콘텐츠를 거기에서 부모로 이동하는 것은 다소 까다 롭습니다.

virtualenv 환경 변수를 파일로 출력하는 쉘 스크립트 (/ tmp에 동적으로 생성 할 수 있음)를 생성해야 할 수 있습니다. 그런 다음 부모 Python 프로세스에서 읽고 os.environ에 넣습니다.

또는 open ( "bin / activate")의 줄을 사용하여 activate 스크립트를 구문 분석하고 수동으로 항목을 추출한 다음 os.environ에 넣습니다. 까다 롭지 만 불가능하지는 않습니다.



2

최고의 답변은 Python 2.x에서만 작동합니다.

Python 3.x의 경우 다음을 사용하십시오.

activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

exec(compile(open(activate_this_file, "rb").read(), activate_this_file, 'exec'), dict(__file__=activate_this_file))

참조 : Python 3에서 execfile의 대안은 무엇입니까?


1
activate_this.py은 무엇인가
랜디 펜

1
@randyPen, activate_this.py 파일은 프로젝트 디렉터리에 virtualenv를 빌드 할 때 자동으로 추가됩니다. (예 : /project/directory/venv/bin/activate_this.py)
TheoreticallyNick

-2

모든를 virtualenv하나의 폴더에 만들어야합니다 virt.

virtualenv 폴더 이름을 변경하지 않으면 virt라고 가정합니다.

cd
mkdir custom

아래 줄을 복사하십시오 ...

#!/usr/bin/env bash
ENV_PATH="$HOME/virt/$1/bin/activate"
bash --rcfile $ENV_PATH -i

셸 스크립트 파일을 만들고 위의 줄을 붙여 넣습니다.

touch custom/vhelper
nano custom/vhelper

파일에 실행 권한을 부여하십시오.

sudo chmod +x custom/vhelper

이제 탭을 클릭하여 명령 줄에서 찾을 수 있도록 해당 사용자 지정 폴더 경로를 내 보냅니다.

내보내기 PATH = $ PATH : "$ HOME / custom"

이제 아래 명령을 입력하여 어디서나 사용할 수 있습니다.

vhelper YOUR_VIRTUAL_ENV_FOLDER_NAME

abc라고 가정하면 ...

vhelper abc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.