Python 스크립트에서 virtualenv 인스턴스를 활성화하고 싶습니다.
나는 그것이 매우 쉽다는 것을 알고 있지만, 내가 본 모든 예제는 그것을 사용하여 env 내에서 명령을 실행 한 다음 하위 프로세스를 닫습니다.
bin / activate와 같은 방식으로 virtualenv를 활성화하고 쉘로 돌아가고 싶습니다.
이 같은:
$me: my-script.py -d env-name
$(env-name)me:
이것이 가능한가?
관련된:
답변
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))