Как активировать virtualenv активировать в скрипте Bash

Как создать скрипт Bash для активации виртуального виртуального Python?

У меня есть структура каталогов, такая как:

.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$ 

Что я делаю не так?

5 Solutions collect form web for “Как активировать virtualenv активировать в скрипте Bash”

Когда вы используете источник, вы загружаете скрипт активации в свою активную оболочку.

Когда вы делаете это в скрипте, вы загружаете его в ту оболочку, которая завершается, когда ваш скрипт заканчивается, и вы вернетесь в свою оригинальную, неактивированную оболочку.

Ваш лучший вариант – сделать это в функции

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

или псевдоним

 alias activate=". ../.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 

Вы должны вызвать скрипт bash с использованием источника.

Вот пример:

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

На вашей оболочке просто назовите это так:

 > source venv.sh 

Или как @outmind предложил:

 > . venv.sh 

Там вы, указатель оболочки будет помещен в ваш запрос.

Sourcing запускает команды оболочки в вашей текущей оболочке. Когда вы находитесь внутри скрипта, как вы делаете выше, вы воздействуете на среду для этого сценария, но когда сценарий завершается, изменения в среде отменены, так как они эффективно выходят за рамки.

Если вы намерены запускать команды оболочки в virtualenv, вы можете сделать это в своем скрипте после поиска сценария активации. Если вы намерены взаимодействовать с оболочкой внутри virtualenv, тогда вы можете создать подстроку внутри вашего скрипта, которая наследует среду.

Для чего нужен скрипт bash?

  1. Если вы собираетесь переключаться между несколькими виртуальными виртуальными машинами или быстро вводить один virtualenv, попробуйте ли вы virtualenvwrapper ? Он предоставляет множество workon venv , mkvirtualenv venv как workon venv , mkvirtualenv venv и т. Д.

  2. Если вы просто запускаете скрипт python в определенном virtualenv, используйте /path/to/venv/bin/python script.py для его запуска.

  • Сломанные ссылки в Virtualenvs
  • Как сообщить скрипту Python использовать определенную версию
  • Использование двух библиотек Python с конфликтующими именами
  • Может ли virtualenv наследовать от другого?
  • Eclipse Pydev: «Ошибка: Python stdlib не найден»
  • Нужно ли использовать virtualenv с Vagrant?
  • PIL говорит, что у него есть «поддержка доступна», но при использовании IOError при сохранении файлов
  • Могу ли я перемещать virtualenv?
  • Python - лучший язык программирования в мире.