IT

Python 스크립트를 사용하여 가상 환경 활성화

itgroup 2023. 9. 5. 20:09
반응형

Python 스크립트를 사용하여 가상 환경 활성화

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

작업이 매우 쉽다는 것은 알지만, 제가 본 모든 예제에서는 환경 내에서 명령을 실행한 다음 하위 프로세스를 종료하는 데 사용합니다.

가상 환경을 활성화하고 bin/activate와 같은 방식으로 셸로 돌아가고 싶습니다.

이와 같은 것:

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

이것이 가능합니까?

관련 항목:

virtualenv › 스크립트에서 env 호출

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

반응형