Python 스크립트를 사용하여 가상 환경 활성화
Python 스크립트에서 가상 환경 인스턴스를 활성화하고 싶습니다.
작업이 매우 쉽다는 것은 알지만, 제가 본 모든 예제에서는 환경 내에서 명령을 실행한 다음 하위 프로세스를 종료하는 데 사용합니다.
가상 환경을 활성화하고 bin/activate와 같은 방식으로 셸로 돌아가고 싶습니다.
이와 같은 것:
$me: my-script.py -d env-name
$(env-name)me:
이것이 가능합니까?
관련 항목:
virtualenv에서 Python 하위 프로세스를 실행하려면 virtualenv 내부에 있는 Python 인터프리터를 사용하여 스크립트를 실행하면 됩니다.bin/
디렉터리:
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 인터프리터에서 가상 환경을 활성화하려면 다음을 호출할 수 있습니다.activate_this.py
스크립트, 다음과 같습니다.
# Doing exec() 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"
exec(open(activate_this_file).read(), {'__file__': activate_this_file})
위의 경우 venv가 아닌 virtualenv 라이브러리를 사용해야 합니다.
venv를 사용하는 경우 virtualenv의 activate_this.py 구현을 복사할 수 있지만 몇 가지 사소한 변경 사항만으로 venv와 함께 작동합니다.
virtualenv의 인터프리터에서 스크립트를 실행하는 가장 간단한 솔루션은 스크립트의 처음과 같이 기본 셰방 라인을 virtualenv의 인터프리터에 대한 경로로 바꾸는 것입니다.
#!/path/to/project/venv/bin/python
스크립트를 실행 파일로 만듭니다.
chmod u+x script.py
스크립트 실행:
./script.py
Voila!
공식 Virtualenv 문서에 따라 다른 Python 환경을 실행하려면 명령행에서 실행 가능한 Python 이진 파일의 전체 경로를 지정할 수 있습니다(가상 환경을 활성화하기 전에 활성화할 필요가 없음).
/path/to/virtualenv/bin/python
가상 환경에서 명령줄에서 스크립트를 호출하려는 경우에도 마찬가지입니다.다음을 수행하기 전에 활성화할 필요가 없습니다.
me$ /path/to/virtualenv/bin/python myscript.py
윈도우즈 환경도 마찬가지입니다(명령줄이든 스크립트든 상관 없음).
> \path\to\env\Scripts\python.exe myscript.py
네, 문제는 간단하지 않지만 해결책은 간단하다는 것이 밝혀졌습니다.
먼저 "소스" 명령을 래핑할 셸 스크립트를 만들어야 했습니다.Bash 스크립트의 소스보다 "."를 사용하는 것이 더 낫다고 읽었기 때문에 "."를 사용했습니다.
#!/bin/bash
. /path/to/env/bin/activate
그런 다음 Python 스크립트를 통해 간단하게 다음 작업을 수행할 수 있습니다.
import os
os.system('/bin/bash --rcfile /path/to/myscript.sh')
모든 속임수는 그 안에 있습니다.--rcfile
논쟁.
Python 인터프리터가 종료되면 활성화된 환경에 현재 셸을 남깁니다.
승리!
저에게 맞는 간단한 해결책입니다.기본적으로 쓸모없는 단계를 수행하는 Bash 스크립트가 왜 필요한지 모르겠습니다(내가 틀렸나요?)
import os
os.system('/bin/bash --rcfile flask/bin/activate')
기본적으로 필요한 작업을 수행합니다.
[hellsing@silence Foundation]$ python2.7 pythonvenv.py
(flask)[hellsing@silence Foundation]$
그런 다음 가상 환경을 비활성화하는 대신 + 또는 종료합니다.그게 가능한 해결책입니까, 아니면 당신이 원했던 것 아닙니까?
상위 답변은 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))
참조:파이썬 3에서 exec 파일의 대안은 무엇입니까?
자식 프로세스 환경은 더 이상 존재하지 않는 순간에 사라지며, 환경 콘텐츠를 거기서 부모로 옮기는 것은 다소 까다롭습니다.
셸 스크립트를 생성해야 할 수도 있습니다(/tmp에 동적으로 생성할 수 있음). 이 스크립트는 가상 환경 변수를 파일로 출력한 다음 상위 Python 프로세스에서 읽고 os.environ에 넣습니다.
또는 open("bin/activate") 상태의 행에 사용하는 활성화 스크립트를 구문 분석하고 수동으로 항목을 추출한 다음 os.environment를 입력합니다.그것은 까다롭지만, 불가능하지는 않습니다.
python2/3의 경우 아래 코드 스니펫을 사용하여 가상 환경을 활성화할 수 있습니다.
activate_this = "/home/<--path-->/<--virtual env name -->/bin/activate_this.py" #for ubuntu
activate_this = "D:\<-- path -->\<--virtual env name -->\Scripts\\activate_this.py" #for windows
with open(activate_this) as f:
code = compile(f.read(), activate_this, 'exec')
exec(code, dict(__file__=activate_this))
저도 같은 문제가 있었는데도 없었습니다.activate_this.py
에 시대에Scripts
사용자 환경의 디렉토리입니다.
activate_this.py
"""By using execfile(this_file, dict(__file__=this_file)) you will
activate this virtualenv environment.
This can be used when you must use an existing Python interpreter, not
the virtualenv bin/python
"""
try:
__file__
except NameError:
raise AssertionError(
"You must run this like execfile('path/to/active_this.py', dict(__file__='path/to/activate_this.py'))")
import sys
import os
base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if(sys.platform=='win32'):
site_packages = os.path.join(base, 'Lib', 'site-packages')
else:
site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')
prev_sys_path = list(sys.path)
import site
site.addsitedir(site_packages)
sys.real_prefix = sys.prefix
sys.prefix = base
# Move the added items to the front of the path:
new_sys_path = []
for item in list(sys.path):
if item not in prev_sys_path:
new_sys_path.append(item)
sys.path.remove(item)
sys.path[:0] = new_sys_path
을 파을에복다니에 합니다.Scripts
사용자 환경의 디렉토리를 다음과 같이 사용합니다.
def activate_virtual_environment(environment_root):
"""Configures the virtual environment starting at ``environment_root``."""
activate_script = os.path.join(
environment_root, 'Scripts', 'activate_this.py')
execfile(activate_script, {'__file__': activate_script})
activate_virtual_environment('path/to/your/venv')
참조: https://github.com/dcreager/virtualenv/blob/master/virtualenv_support/activate_this.py
당신은 당신의 모든 것을 만들어야 합니다.virtualenv
는 하 폴의있다습니더에나,▁s▁as와 의 폴더에 .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
언급URL : https://stackoverflow.com/questions/6943208/activate-a-virtualenv-with-a-python-script
'IT' 카테고리의 다른 글
mysql에 비해 npm mariasql의 이점 (0) | 2023.09.05 |
---|---|
MySQL에 대한 SQL LEFT-JOIN 2개 필드 (0) | 2023.09.05 |
문자열 값 앞에 있는 'u' 기호는 무엇을 의미합니까? (0) | 2023.09.05 |
제로 길이 비트 필드의 실용적인 사용 (0) | 2023.09.05 |
npm 구성을 기본값으로 복원/재설정하는 방법은 무엇입니까? (0) | 2023.09.05 |