Подтвердить что ты не робот

Активация VirtualEnv с использованием оболочки script, похоже, не работает

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

#!/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)[email protected]:$

Итак, я изменил оболочку script на

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

как предложено и используется

$ bash virtualenv_activate.sh 
[email protected]:$

для запуска script.

Это не вызывает ошибку, но также не активирует виртуальный env

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

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

4b9b3361

Ответ 1

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

Решение состоит в том, чтобы запустить script в bash. Измените первую строку на...

#!/bin/bash

Затем запустите с...

./virtualenv_activate.sh

... или...

/bin/bash virtualenv_activate.sh

Edit:

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

source virtualenv_activate.sh

... или...

. virtualenv_activate.sh

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

Ответ 2

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

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

В activate.sh у меня есть

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

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

И я выполняю этот путь:

`./activate.sh`

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

Ответ 3

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

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

НТН.

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