Как создать сценарий Bash для активации виртуального сервера Python?
У меня есть такая структура каталогов:
.env
bin
activate
...other virtualenv files...
src
shell.sh
...my code...
Я могу активировать свой виртуальный сервер:
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$
Что я делаю не так?
python
bash
virtualenv
Cerin
источник
источник
source
- изменить что-то в текущей оболочке. Вы можете использовать python virtualenv, используя полный путь./env/bin/python
.Ответы:
Когда вы исходите, вы загружаете скрипт активации в активную оболочку.
Когда вы делаете это в скрипте, вы загружаете его в ту оболочку, которая завершается, когда ваш скрипт завершается, и вы возвращаетесь к исходной неактивированной оболочке.
Лучшим вариантом было бы сделать это в функции
activate () { . ../.env/bin/activate }
или псевдоним
alias activate=". ../.env/bin/activate"
Надеюсь это поможет.
источник
Вы должны вызвать сценарий 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
Вот и все, в командной строке появится индикация оболочки.
источник
source "/home/surest/Desktop/testservers/TEST_VENV/venv3/bin/activate"
дает:/home/surest/Desktop/testservers/TEST_VENV/py3.sh: 10: /home/surest/Desktop/testservers/TEST_VENV/py3.sh: source: not found
which source
приглашении оболочки, ноsource venv3/bin/activate
делаю то, что ожидаю, и открываю venv. ...source ./env/bin/activate
(с таким же#!/bin/bash
префиксом) нет? В чем разница между использованием кавычек и нет?source ./env/bin/activate
потому что это связано с тем путем, по которому вы бежите, верно? Если вы измените каталог внутри скрипта, вы можете перейти в относительный.Хотя он не добавляет префикс «(.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
источник
/bin/bash
к/usr/bin/env bash
deactivate
из подоболочки с помощьюexit
или Ctrl + dSourcing запускает команды оболочки в вашей текущей оболочке. Когда вы делаете исходный код внутри сценария, как вы делаете выше, вы влияете на среду для этого сценария, но когда сценарий завершается, изменения среды отменяются, поскольку они фактически вышли за пределы области видимости.
Если вы намереваетесь запускать команды оболочки в virtualenv, вы можете сделать это в своем скрипте после получения скрипта активации. Если ваше намерение состоит в том, чтобы взаимодействовать с оболочкой внутри 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?
Если вы собираетесь переключаться между несколькими виртуальными виртуальными машинами или быстро войти в одну виртуальную среду, вы пробовали
virtualenvwrapper
? Это дает много утилитами , какworkon venv
,mkvirtualenv venv
и так далее.Если вы просто запускаете скрипт Python в определенном виртуальном окружении, используйте
/path/to/venv/bin/python script.py
для его запуска.источник
workon ...
из сценария bash. (Потому что я хочу выполнять дальнейшие действия каждый раз при его запуске.) Однако не могу найти способ заставить его работать.Вы также можете сделать это с помощью подоболочки, чтобы лучше сдерживать ваше использование - вот практический пример:
#!/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
или очень частоисточник
$(...)
заключить в двойные кавычки, иначе в выводе будут отсутствовать пробелы и табуляции."${VAR}"
строго эквивалентно тому, что"$VAR"
вам не нужны фигурные скобки вокруг переменных оболочки, потому что двойные кавычки на самом деле более эффективны. Исключение при использовании модификаторов , таких как, например"${VAR:-default_value}"
PATH=$PATH:/opt/bin
требуется правильное цитирование для обработки путей с пробелами и табуляциями.edit
кнопку под сообщениями, чтобы предлагать им изменения! Кроме того, пусть будет известно, что, хотя это часто является требованием и важно для безопасности, любой, кто сознательно добавляетIFS
символы,PATH
является террористом.Вы должны использовать несколько команд в одной строке. например:
os.system(". Projects/virenv/bin/activate && python Projects/virenv/django-project/manage.py runserver")
когда вы активируете свою виртуальную среду в одной строке, я думаю, что это забывает о других командных строках, и вы можете предотвратить это, используя несколько команд в одной строке. У меня сработало :)
источник
Когда я изучал venv, я создал сценарий, чтобы напомнить мне, как его активировать.
#!/bin/sh # init_venv.sh if [ -d "./bin" ];then echo "[info] Ctrl+d to deactivate" bash -c ". bin/activate; exec /usr/bin/env bash --rcfile <(echo 'PS1=\"(venv)\${PS1}\"') -i" fi
Это имеет то преимущество, что меняет подсказку.
источник