[python] 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에서 쉘 명령을 실행하려는 경우 activate 스크립트를 소싱 한 후 스크립트에서 수행 할 수 있습니다. virtualenv 내부의 셸과 상호 작용하려는 경우 환경을 상속하는 스크립트 내부에 하위 셸을 생성 할 수 있습니다.


답변

자주 사용하는 스크립트입니다. 다음으로 실행$ source script_name

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

activate


답변

bash 스크립트는 무엇을 위해 소싱합니까?

  1. 여러 virtualenv 사이를 전환하거나 하나의 virtualenv를 빠르게 입력하려는 경우 시도해 보셨습니까 virtualenvwrapper? workon venv, 등과 같은 많은 유틸리티를 제공합니다 mkvirtualenv venv.

  2. 특정 virtualenv에서 python 스크립트를 실행하는 경우을 사용 /path/to/venv/bin/python script.py하여 실행하십시오.


답변

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

#!/bin/bash

commandA --args

# Run commandB in a subshell and collect its output in $VAR
# NOTE
#  - PATH is only modified as an example
#  - output beyond a single value may not be captured without quoting
#  - it is important to discard (or separate) virtualenv activation stdout
#    if the stdout of commandB is to be captured
#
VAR=$(
    PATH="/opt/bin/foo:$PATH"
    . /path/to/activate > /dev/null  # activate virtualenv
    commandB  # tool from /opt/bin/ which requires virtualenv
)

# Use the output from commandB later
commandC "$VAR"

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

  • 다른 버전 commandA또는 commandC아래에 존재/opt/bin
  • commandB시스템에 존재 PATH하거나 매우 일반적입니다
  • 이러한 명령은 virtualenv에서 실패합니다.
  • 다양한 가상 환경이 필요합니다.