Вопрос по bash, python, virtualenv – Как активировать исходный код virtualenv в скрипте Bash

67

Как создать сценарий Bash для активации Python virtualenv?

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

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

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

@NgureNyaga, нет, этот вопрос не совпадает с моим. Oни'Вы спрашиваете, как источник из произвольного места. Я уже знаю, как это сделать. Я'Я спрашиваю, как создать исходный код в скрипте bash и поддерживать его. Cerin
Когда вы запускаете скрипт оболочки, вы фактически создаете новую оболочку. Точка использованияsource это изменить что-то в текущей оболочке. Вы можете использовать virtualenvS Python, используя полный путь../env/bin/python Pablo Navarro

Ваш Ответ

6   ответов
13

я обнаружил, что этот скрипт работает, как ожидалось.

#!/bin/bash
script_dir=`dirname $0`
cd $script_dir
/bin/bash -c ". ../.env/bin/activate; exec /bin/bash -i"

например

[email protected]:~/src$ which pip
/usr/local/bin/pip
[email protected]:~/src$ which python
/usr/bin/python
[email protected]:~/src$ ./shell
[email protected]:~/src$ which pip
~/.env/bin/pip
[email protected]:~/src$ which python
~/.env/bin/python
[email protected]:~/src$ exit
exit
Ох .. Я должен прочитать больше в первую очередь. Виноват! richo
Это работает в 2019 году! На macos мне просто нужно было поменять/bin/bash в/usr/bin/env bash valem
Cerinявляется ОП ;-) zigg
технически тынерестилище. Это'Это не обязательно проблема, но вы должны изложить это для ОП. richo
Это сработало, но я должен был дать свое разрешениеактивировать» файл до. Adrian Lopez
8

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

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

0

Если вы собираетесь переключаться между несколькими virtualenv или быстро вводить один virtualenv, пробовали ли выvirtualenvwrapper? Это обеспечивает много утилит, таких как,workon venvmkvirtualenv venv и так далее.

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

50

выперезагружаем скрипт активации в вашу активную оболочку.

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

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

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

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

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

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

Ваша идея с псевдонимом тоже сработала. Просто примечание: я должен был поставить его (псевдоним abcdef = "источник ... / bin / activ ") в моем скрипте .zshrc (или .bashrc для пользователей bash), чтобы он работал. shahins
Я понятия не имел, что происходило, когда я создавал исходные тексты. Это значительно изменило мой сценарий bash к лучшему. Спасибо! Robert Townley
я совсем новичок в bash и т. д. Можете ли вы расширить этот пример, чтобы он показывал полный сценарий? AljoSt
Это хорошее решение, если ваши virtualenvs используют имя папки по умолчанию. Раньше у меня было несколько репо в папке, что создавало беспорядок в virtualenvs. Я переключился на это значение по умолчанию сейчас. 3manuek
для windows c: \ tutorial>. \ Окр \ Scripts \ активировать max4ever
0

используя подоболочку, чтобы лучше ограничить использование - здесь 'практический пример:

#!/bin/bash

commandA --args

# Run commandB in a subshell and collect its output in $VAR
VAR=$(
    PATH=$PATH:/opt/bin
    . /path/to/activate > /dev/null
    commandB  # tool from /opt/bin that requires virtualenv
)

# Use the output of the commandB later
commandC "${VAR}"

Этот стиль особенно полезен, когда

commandA или жеcommandB существуют в/opt/binэти команды терпят неудачу под virtualenvвам нужно множество различных virtualenvs
39

Вот пример:

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

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

> source venv.sh

Или, как предложил @outmind: (Обратите внимание, что это не работает с Zsh)

> . venv.sh

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

Я также ничего не получаю, когда я печатаюwhich source пока в командной строке,source venv3/bin/activate делает то, что я ожидаю, и открываю venv. ... Surest Texas
или даже просто, venv.sh» outmind
У меня нет проблем с использованием исходного кода внутри скрипта без кавычек. Я вижу проблему сsource ./env/bin/activate потому что это относительно пути, по которому вы бежите, верно? Если вы измените каталог внутри скрипта, то вы можете пойти относительно. Flavio Garcia
независимо от того, что я пытаюсь, этоsource "/home/surest/Desktop/testservers/TEST_VENV/venv3/bin/activate" производит:/home/surest/Desktop/testservers/TEST_VENV/py3.sh: 10: /home/surest/Desktop/testservers/TEST_VENV/py3.sh: source: not found Surest Texas

Похожие вопросы