developer tip

Bash 스크립트에서 virtualenv 활성화를 소싱하는 방법

copycodes 2020. 10. 19. 08:13
반응형

Bash 스크립트에서 virtualenv 활성화를 소싱하는 방법


Python virtualenv를 활성화하기 위해 Bash 스크립트를 어떻게 생성합니까?

다음과 같은 디렉토리 구조가 있습니다.

.env
    bin
        activate
        ...other virtualenv files...
src
    shell.sh
    ...my code...

다음과 같이 내 virtualenv를 활성화 할 수 있습니다.

user@localhost:src$ . ../.env/bin/activate
(.env)user@localhost:src$

그러나 Bash 스크립트에서 동일한 작업을 수행하면 아무 작업도 수행되지 않습니다.

user@localhost:src$ cat shell.sh
#!/bin/bash
. ../.env/bin/activate
user@localhost:src$ ./shell.sh
user@localhost:src$ 

내가 도대체 ​​뭘 잘못하고있는 겁니까?


소싱 할 때 활성 셸에 활성화 스크립트를로드합니다.

스크립트에서 수행하면 스크립트가 완료되면 종료되고 활성화되지 않은 원래 셸로 돌아 오는 해당 셸로로드합니다.

가장 좋은 방법은 함수에서 수행하는 것입니다.

activate () {
  . ../.env/bin/activate
}

또는 별칭

alias activate=". ../.env/bin/activate"

도움이 되었기를 바랍니다.


source를 사용하여 bash 스크립트를 호출해야합니다.

다음은 그 예입니다.

#!/bin/bash
# Let's call this script venv.sh
source "<absolute_path_recommended_here>/.env/bin/activate"

쉘에서 다음과 같이 호출하십시오.

> source venv.sh

또는 @outmind가 제안한대로 : (zsh에서는 작동하지 않음)

> . venv.sh

거기에 쉘 표시가 프롬프트에 배치됩니다.


쉘 프롬프트에 "(.env)"접두사를 추가하지는 않지만이 스크립트가 예상대로 작동한다는 것을 알았습니다.

#!/bin/bash
script_dir=`dirname $0`
cd $script_dir
/bin/bash -c ". ../.env/bin/activate; exec /bin/bash -i"

예 :

user@localhost:~/src$ which pip
/usr/local/bin/pip
user@localhost:~/src$ which python
/usr/bin/python
user@localhost:~/src$ ./shell
user@localhost:~/src$ which pip
~/.env/bin/pip
user@localhost:~/src$ which python
~/.env/bin/python
user@localhost:~/src$ exit
exit

소싱은 현재 셸에서 셸 명령을 실행합니다. 위와 같이 스크립트 내부에서 소스를 사용하면 해당 스크립트의 환경에 영향을 주지만 스크립트가 종료되면 환경 변경이 취소되어 효과적으로 범위를 벗어났습니다.

virtualenv에서 쉘 명령을 실행하려는 경우 활성화 스크립트를 소싱 한 후 스크립트에서이를 수행 할 수 있습니다. virtualenv 내부의 셸과 상호 작용하려는 경우 환경을 상속하는 스크립트 내부의 하위 셸을 생성 할 수 있습니다.


사용을 더 잘 포함하기 위해 서브 쉘을 사용하여이 작업을 수행 할 수도 있습니다. 실제 예는 다음과 같습니다.

#!/bin/bash

commandA --args

# Run commandB in a subshell and collect its output in $VAR
VAR=$(
    PATH=$PATH:/opt/bin
    . /path/to/activate > /dev/null
    commandB  # tool from /opt/bin that requires virtualenv
)

# Use the output of the commandB later
commandC "${VAR}"

이 스타일은 특히 다음과 같은 경우에 유용합니다.

  • commandA또는 commandB존재/opt/bin
  • these commands fail under the virtualenv
  • you need a variety of different virtualenvs

What does sourcing the bash script for?

  1. If you intend to switch between multiple virtualenvs or enter one virtualenv quickly, have you tried virtualenvwrapper? It provides a lot of utils like workon venv, mkvirtualenv venv and so on.

  2. If you just run a python script in certain virtualenv, use /path/to/venv/bin/python script.py to run it.


Here is the script that I use often

#!/bin/bash -x
PWD=`pwd`
/usr/local/bin/virtualenv --python=python3 venv
echo $PWD
activate () {
    . $PWD/venv/bin/activate
}

activate

You should use multiple commands in one line. for example:

os.system(". Projects/virenv/bin/activate && python Projects/virenv/django-project/manage.py runserver")

when you activate your virtual environment in one line, I think it forgets for other command lines and you can prevent this by using multiple commands in one line. It worked for me :)

참고URL : https://stackoverflow.com/questions/13122137/how-to-source-virtualenv-activate-in-a-bash-script

반응형