Активация VirtualEnv с помощью сценария оболочки, похоже, не работает - PullRequest
44 голосов
/ 10 сентября 2011

Я попытался активировать VirtualEnv через скрипт оболочки, как показано ниже, но, похоже, он не работает,

#!/bin/sh
source ~/.virtualenvs/pinax-env/bin/activate

Я получаю следующую ошибку

$ sh virtualenv_activate.sh 
virtualenv_activate.sh: 2: source: not found

но если я ввожу ту же команду на терминале, похоже, она будет работать

$ source ~/.virtualenvs/pinax-env/bin/activate
(pinax-env)gautam@Aspirebuntu:$

Итак, я изменил сценарий оболочки на

#!/bin/bash
source ~/.virtualenvs/pinax-env/bin/activate

как предложено и использовано

$ bash virtualenv_activate.sh 
gautam@Aspirebuntu:$

для запуска скрипта.

Это не выдает ошибку, но и не активирует виртуальную среду

То есть какие-либо предложения о том, как решить эту проблему?

PS: я использую Ubuntu 11.04

Ответы [ 4 ]

59 голосов
/ 10 сентября 2011

TLDR

Должен запускать скрипт .sh с source вместо скрипта исключительно

source your-script.sh

а не your-script.sh

Подробнее

sh - это не то же самое, что bash (хотя некоторые системы просто связывают sh с bash, поэтому запуск sh фактически запускает bash). Вы можете думать о sh как о разбавленной версии bash. У bash есть то, чего нет у sh - команда «source». Вот почему вы получаете эту ошибку ... источник прекрасно работает в вашей оболочке bash. Но когда вы запускаете скрипт с помощью sh, вы запускаете скрипт в оболочке в подпроцессе. Поскольку этот скрипт выполняется в sh, «источник» не найден.

Решение - вместо этого запустить скрипт в bash. Измените первую строку на ...

#!/bin/bash

Тогда беги с ...

./virtualenv_activate.sh

... или ...

/bin/bash virtualenv_activate.sh

Edit:

Если вы хотите, чтобы активация virtualenv изменила оболочку, из которой вы вызываете скрипт, вам нужно использовать «источник» или «оператор точки». Это гарантирует, что скрипт запускается в текущей оболочке (и, следовательно, изменяет текущую среду) ...

source virtualenv_activate.sh

... или ...

. virtualenv_activate.sh

Как примечание, именно поэтому virtualenv всегда говорит, что вам нужно использовать «источник» для запуска сценария активации.

7 голосов
/ 10 сентября 2011

source - это встроенная команда оболочки в bash, которая недоступна в sh. Если я правильно помню, то виртуальная среда делает много манипуляций с переменными пути и окружения. Даже запуск его как bash virtualenv_blah.sh не будет работать, так как это просто создаст среду внутри вложенной оболочки.

Попробуйте . virtualenv_activate.sh или source virtualenv_activate.sh. Это в основном заставляет скрипт работать в вашей текущей среде, и все переменные среды, измененные активацией virtualenv, будут доступны.

НТН.

Редактировать: вот ссылка, которая может помочь - http://ss64.com/bash/period.html

5 голосов
/ 10 ноября 2013

В Mac OS X ваши предложения, кажется, не работают.

Я сделал это таким образом.Я не очень доволен решением, но в любом случае поделитесь им здесь и надеюсь, что, возможно, кто-то предложит лучший вариант:

В activate.sh У меня

echo 'source /Users/andi/.virtualenvs/data_science/bin/activate'

Я даю исполнениеразрешения: chmod +x activate.sh

И я выполняю это следующим образом:

`./activate.sh`

Обратите внимание, что есть парантез в виде кода ASCII 96 = `(Серьезный акцент)

0 голосов
/ 13 ноября 2018

В моем случае, Ubuntu 16.04, описанные выше методы не сработали или требуют много работы.

Я только что сделал ссылку на файл сценария 'активации' и скопировал его в домашнюю папку (или в папку, доступную $ PATH) и переименовал ее в простую, например, 'actai'.

Тогда в терминале просто позвоните 'source actai'. Это сработало!

...