Как активировать python virtualenv через shell-скрипт?

Вопрос или проблема

Мне нужно активировать виртуальное окружение (venv), поэтому я запускаю эти команды вручную в терминале:

source .venv/bin/activate # Для активации виртуального окружения.

и

deactivate # Для деактивации виртуального окружения

Это работает нормально при ручном запуске. Теперь мне нужно вставить эти команды в bash-скрипт, чтобы AWS CodeDeploy развернул его на сервере Ubuntu 18.04.

Мой bash-скрипт с именем after_install.sh выглядит так…

#!/usr/bin/env bash

set -e
source .venv/bin/activate
## ДЕЛАЕМ ЧТО-ТО ##
deactivate

Для локального тестирования я сделал скрипт исполняемым и запустил его с помощью bash after_install.sh. Но ничего не произошло. Виртуальное окружение не активируется. Кажется, ни одна из вышеперечисленных команд не сработала при запуске bash-скрипта.

Я не понимаю, почему эти команды работают, когда я запускаю их вручную, но не с bash-скриптом. Что происходит? Мне нужно написать эти команды внутри bash-скрипта, чтобы AWS CodeDeploy смог развернуть его на сервере.

source file_name.sh

также сработало для меня (по ответу Дипанвиты Маллика).

Полное объяснение, почему это работает, предоставлено здесь Лесманой.
Вкратце:

  • Вызов скрипта позволит выполнить команды в текущем процессе оболочки. Изменения в окружении вступают в силу в текущей оболочке.
  • Выполнение скрипта запустит команды в новом процессе оболочки.

Попробуйте использовать полный путь к директории virtualenv.

#!/usr/bin/env bash

set -e
source /full-path/to/.venv/bin/activate
## ДЕЛАЕМ ЧТО-ТО -> ИСПОЛЬЗУЙТЕ ПОЛНЫЙ ПУТЬ И ДЛЯ ЭТОГО #
deactivate

С наилучшими пожеланиями.

Используйте source для запуска shell-скрипта.

source file_name.sh

Это сработало для меня.

Кроме файла “activate” я вижу файл python в .my_env/bin/
поэтому просто написание .sh файла с одной строкой

./my_env/bin/python start.py

работает нормально. этот python из окружения и он может видеть все необходимые зависимости.

Вы можете сделать следующее:

#!/usr/bin/env bash

set -e
source .venv/bin/activate && \
echo "ДЕЛАЕМ ЧТО-ТО" && \
deactivate

Ответ или решение

Для активации виртуального окружения Python (venv) через скрипт оболочки в контексте AWS CodeDeploy, важно понимать, как работает активация виртуального окружения и как различаются методы выполнения скриптов в bash.

Проблема

Вы уже заметили, что команды активации и деактивации виртуального окружения работают в терминале, но не в вашем bash-скрипте after_install.sh. Это происходит из-за того, что при выполнении скрипта в bash, команды выполняются в новом дочернем процессе. Таким образом, любые изменения, внесенные в среду (например, активация виртуального окружения), не будут отражены в родительском процессе.

Решение

Чтобы изменить это поведение, вам нужно использовать команду source для вашего скрипта. Это позволит запускать команды в текущем контексте оболочки.

Шаги для активации виртуального окружения через bash-скрипт

  1. Создайте ваш скрипт: Если ваш скрипт называется after_install.sh, убедитесь, что он выглядит следующим образом:
#!/usr/bin/env bash

set -e
source /путь/к/.venv/bin/activate
# Здесь выполняем необходимые команды
echo "Делаем что-то в окружении venv"
deactivate
  1. Обеспечьте правильные права доступа: Для того чтобы ваш скрипт мог выполняться, убедитесь, что у него есть необходимые права на исполнение. Вы можете сделать это с помощью команды:
chmod +x after_install.sh
  1. Запустите скрипт с использованием source: Для того чтобы активировать виртуальное окружение и выполнить команды в текущем процессе, запускайте скрипт следующим образом:
source after_install.sh

Дополнительные советы

  • Используйте полный путь к виртуальному окружению, чтобы избежать возможных ошибок, связанных с текущей директорией.
  • Проверьте пути к скриптам и ресурсам, которые вы собираетесь использовать в вашем скрипте, чтобы они были корректными относительно местоположения запуска.

Пример использования

Допустим, вы хотите использовать Python-скрипт после активации venv. Вы можете дополнить ваш bash-скрипт следующим образом:

#!/usr/bin/env bash

set -e
source /путь/к/.venv/bin/activate
python /путь/к/вашему/python_скрипту.py
deactivate

Заключение

Использование source для запуска вашего скрипта — это ключ к успешной активации виртуального окружения в bash. Это решение освобождает вас от проблем, связанных с изолированным процессом, обеспечивая корректное выполнение необходимых команд в нужном контексте. Надеюсь, эта информация поможет вам реализовать требования вашего проекта в AWS CodeDeploy.

Оцените материал
Добавить комментарий

Капча загружается...