Вопрос или проблема
Мне нужно активировать виртуальное окружение (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-скрипт
- Создайте ваш скрипт: Если ваш скрипт называется
after_install.sh
, убедитесь, что он выглядит следующим образом:
#!/usr/bin/env bash
set -e
source /путь/к/.venv/bin/activate
# Здесь выполняем необходимые команды
echo "Делаем что-то в окружении venv"
deactivate
- Обеспечьте правильные права доступа: Для того чтобы ваш скрипт мог выполняться, убедитесь, что у него есть необходимые права на исполнение. Вы можете сделать это с помощью команды:
chmod +x after_install.sh
- Запустите скрипт с использованием
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.