python - установка - virtualenv что это




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

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

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

.env
    bin
        activate
        ...other virtualenv files...
src
    shell.sh
    ...my code...

Я могу активировать свой virtualenv:

[email protected]:src$ . ../.env/bin/activate
(.env)[email protected]:src$

Однако делать то же самое из сценария Bash ничего не делает:

[email protected]:src$ cat shell.sh
#!/bin/bash
. ../.env/bin/activate
[email protected]:src$ ./shell.sh
[email protected]:src$ 

Что я делаю неправильно?


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

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


Вы должны вызвать скрипт 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

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


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

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

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


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

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

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

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

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

alias activate=". ../.env/bin/activate"

Надеюсь это поможет.





virtualenv