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?
If you intend to switch between multiple virtualenvs or enter one virtualenv quickly, have you tried
virtualenvwrapper
? It provides a lot of utils likeworkon venv
,mkvirtualenv venv
and so on.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
'developer tip' 카테고리의 다른 글
How to assign padding to Listview item divider line (0) | 2020.10.20 |
---|---|
내 포트를 사용하는 애플리케이션을 어떻게 찾습니까? (0) | 2020.10.19 |
Google Maps API는 AJAX를 사용할 때만 "Uncaught ReferenceError : google is not defined"를 발생시킵니다. (0) | 2020.10.19 |
다중 / 인 테이블 유효? (0) | 2020.10.19 |
Numpy isnan ()이 float 배열에서 실패합니다 (pandas 데이터 프레임 적용). (0) | 2020.10.19 |