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 스크립트는 무엇을 위해 소싱합니까?
-
여러 virtualenv 사이를 전환하거나 하나의 virtualenv를 빠르게 입력하려는 경우 시도해 보셨습니까
virtualenvwrapper
?workon venv
, 등과 같은 많은 유틸리티를 제공합니다mkvirtualenv venv
. -
특정 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에서 실패합니다.
- 다양한 가상 환경이 필요합니다.