2011-09-10 13 views
34

Probé la activación de un virtualenv a través de una secuencia de comandos shell como la de abajo, pero no parece funcionar,Activación de un virtualenv usando un script de shell no parece trabajar

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

me sale el siguiente error

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

pero si entro en el mismo comando en el terminal parece que funciona

$ source ~/.virtualenvs/pinax-env/bin/activate 
(pinax-env)[email protected]:$ 

Así que cambió el shell script para

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

como se sugiere y se utiliza

$ bash virtualenv_activate.sh 
[email protected]:$ 

para ejecutar el script.

Eso no tira un error pero tampoco que activan el env virtuales

Por lo que cualquier sugerencia sobre cómo resolver este problema?

PS: Estoy usando Ubuntu 11.04

+1

try 'bash virtualenv_activate.sh' – arunkumar

+1

puede por favor elaborarlo y publicarlo como respuesta. – Gautam

Respuesta

39

sh no es lo mismo que bash (aunque algunos sistemas simplemente enlazar sh para golpear, por lo que ejecutar sh realmente ejecuta bash). Puedes pensar en sh como una versión diluida de bash. Una cosa que bash tiene que sh no es el comando "fuente". Es por eso que estás obteniendo ese error ... la fuente funciona bien en tu shell bash. Pero cuando inicia su script usando sh, ejecuta el script en un shell en un subproceso. Como esa secuencia de comandos se ejecuta en sh, "fuente" no se encuentra.

La solución es ejecutar el script en bash en su lugar. Cambie la primera línea de ...

#!/bin/bash 

Entonces funcionar con ...

./virtualenv_activate.sh 

... o ...

/bin/bash virtualenv_activate.sh 

Editar:

Si desea activar el virtualenv para cambiar el shell del que llama el script, necesita usa la "fuente" o "operador de punto". Esto asegura que el script se ejecuta en el shell actual (y por lo tanto, cambia el entorno actual) ...

source virtualenv_activate.sh 

... o ...

. virtualenv_activate.sh 

Como nota al margen, esto es por qué virtualenv siempre dice que necesitas usar "fuente" para ejecutar su script de activación.  

+1

o use el equivalente de la shell soportada de la fuente, es decir '. envFile', a menudo denominado 'dot the envFile'. Buena suerte ;-) – shellter

+1

Gracias, pero eso no parece resolver el problema, Cuando uso bash no arroja un error, pero tampoco activa el virtualenv. Podría elaborar en .envFile – Gautam

+5

Cuando ejecuta estos scripts de la manera que he mostrado, en realidad crea un NUEVO shell y ejecuta el script en ese shell. Como todo el punto de la secuencia de comandos de "fuente" es cambiar el shell actual, esto frustra el propósito. Ejecute su script usando "source virtualenv_activate.sh" o ". Virtualenv_activate.sh" (observe el espacio después de ese primer período). –

3

source es un comando de shell incorporado en bash, y no está disponible en sh. Si recuerdo correctamente, el entorno virtual realiza una gran cantidad de manipulación de variables de ruta y entorno. Incluso ejecutarlo como bash virtualenv_blah.sh no funcionará, ya que esto simplemente creará el entorno dentro del subconjunto.

Pruebe . virtualenv_activate.sh o source virtualenv_activate.sh Esto básicamente hace que la secuencia de comandos se ejecute en su entorno actual y todas las variables de entorno modificadas por virtualenv's activate estarán disponibles.

HTH.

Editar: Aquí hay un enlace que podría ayudar - http://ss64.com/bash/period.html

4

En Mac OS X sus propuestas no parece trabajar.

Lo he hecho de esta manera. No Soy muy feliz con la solución, pero que comparten todos modos aquí y esperanza, que tal vez alguien le sugerirá el mejor uno:

En activate.sh tengo

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

Doy permisos de ejecución por: chmod +x activate.sh

Y ejecuto esta manera:

`./activate.sh` 

cuenta de que hay un paréntesis en forma de código ASCII 96 = `(Grav e acento)

Cuestiones relacionadas