Не удается активировать виртуальную среду с помощью сценария оболочки

Я прочитал похожие вопросы и попробовал их предложения, но все еще не могу активировать свою виртуальную среду. Иерархия каталогов:

myproject
-- virtualenv
-- startvenv.sh

startvenv.sh это:

#!/bin/bash
source virtualenv/bin/activate

И я запускаю startvenv.sh:

./startvenv.sh

Нет ошибки, но ничего не происходит. Зачем? В идеале я хочу открыть новый терминал и активировать там свою виртуальную среду.

1 ответ

Решение

Virtualenv активирует путем поиска (обычно не работает) virtualenv/bin/activate скрипт. Если вы хотите сделать это в своем собственном сценарии, то вы должны также создать этот сценарий, а не просто запустить его. Имея в виду:

source startvenv.sh

Разница между запуском и поиском заключается в том, что при запуске исполняется скрипт в отдельной отдельной подоболочке, изолированной от родительской оболочки (той, из которой вы ее вызвали), так что, например, переменные среды и другие изменения внутри скрипта не распространяются на родитель.

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

Вот короткая выдержка из man bash (раздел о Shell Builtins):

    .  filename [arguments]
   source filename [arguments]
          Read and execute commands from filename  in  the  current  shell
          environment  and return the exit status of the last command exe‐
          cuted from filename.  [ ... ]
Другие вопросы по тегам