web-dev-qa-db-fra.com

L'activation d'un VirtualEnv à l'aide d'un script Shell ne semble pas fonctionner

J'ai essayé d'activer un VirtualEnv via un script Shell comme celui ci-dessous mais cela ne semble pas fonctionner,

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

J'obtiens l'erreur suivante

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

mais si j'entre la même commande sur le terminal, cela semble fonctionner

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

J'ai donc changé le script Shell en

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

comme suggéré et utilisé

$ bash virtualenv_activate.sh 
gautam@Aspirebuntu:$

pour exécuter le script.

Cela ne génère pas d'erreur, mais cela n'active pas non plus l'environnement virtuel

Donc, toute suggestion sur la façon de résoudre ce problème?

PS: j'utilise Ubuntu 11.04

44
Gautam

TLDR

Doit exécuter le script .sh avec source au lieu du script uniquement

source your-script.sh

et non your-script.sh

Détails

sh n'est pas la même chose que bash (bien que certains systèmes lient simplement sh à bash, donc exécuter sh s'exécute en fait bash). Vous pouvez considérer sh comme une version édulcorée de bash. Une chose que bash n'a pas, c'est la commande "source". C'est pourquoi vous obtenez cette erreur ... la source fonctionne bien dans votre shell bash. Mais lorsque vous démarrez votre script à l'aide de sh, vous exécutez le script dans un shell dans un sous-processus. Puisque ce script s'exécute dans sh, "source" est introuvable.

La solution consiste à exécuter le script en bash à la place. Remplacez la première ligne par ...

#!/bin/bash

Ensuite, courez avec ...

./virtualenv_activate.sh

...ou...

/bin/bash virtualenv_activate.sh

Modifier:

Si vous souhaitez que l'activation de virtualenv modifie le shell à partir duquel vous appelez le script, vous devez utiliser "source" ou "opérateur point". Cela garantit que le script est exécuté dans le shell actuel (et modifie donc l'environnement actuel) ...

source virtualenv_activate.sh

...ou...

. virtualenv_activate.sh

En remarque, c'est pourquoi virtualenv dit toujours que vous devez utiliser "source" pour exécuter son script d'activation.

60
Mark Hildreth

source est une commande Shell intégrée dans bash, et n'est pas disponible dans sh. Si je me souviens bien, virtual env fait beaucoup de manipulation de variables de chemin et d'environnement. Même en l'exécutant comme bash virtualenv_blah.sh ne fonctionnera pas car cela créera simplement l'environnement à l'intérieur du sous-shell.

Essayez . virtualenv_activate.sh ou source virtualenv_activate.sh cela permet essentiellement au script de s'exécuter dans votre environnement actuel et toutes les variables d'environnement modifiées par l'activation de virtualenv seront disponibles.

HTH.

Edit: Voici un lien qui pourrait aider - http://ss64.com/bash/period.html

7
arunkumar

Sur Mac OS X, vos propositions ne semblent pas fonctionner.

Je l'ai fait de cette façon. Je ne suis pas très satisfait de la solution, mais partagez-la quand même ici et j'espère que quelqu'un suggérera peut-être la meilleure:

Dans activate.sh J'ai

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

J'accorde des autorisations d'exécution par: chmod +x activate.sh

Et j'exécute de cette façon:

`./activate.sh`

Notez qu'il y a des parenthèses sous forme de ASCII code 96 = `(accent grave)

5
andilabs

Dans mon cas, Ubuntu 16.04, les méthodes ci-dessus n'ont pas bien fonctionné ou nécessitent beaucoup de travaux.

Je viens de créer un lien vers le fichier de script "activer" et de le copier dans le dossier personnel (ou dans le dossier accessible par $ PATH) et de le renommer en un simple comme "actai".

Ensuite, dans un terminal, appelez simplement "source actai". Ça a marché!

0
Jaeyoon Jeong