[python] Python 스크립트로 virtualenv 활성화

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

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

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

이 같은:

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

이것이 가능한가?

관련된:

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



답변

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


답변

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

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

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

chmod u+x script.py

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

./script.py

짜잔!


답변

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

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

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

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

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

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

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

승리!


답변

공식 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


답변

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

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

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

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

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


답변

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

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

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


답변

최고의 답변은 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의 대안은 무엇입니까?