2011-09-10 12 views
34

ho cercato di attivare un virtualenv attraverso uno script di shell come quella qui sotto, ma non sembra funzionare,Attivazione di un virtualenv utilizzando uno script di shell non sembra funzionare

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

ottengo il seguente errore

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

ma se entro lo stesso comando su terminale sembra funzionare

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

Così ho cambiato il shell script per

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

come suggerito ed usato

$ bash virtualenv_activate.sh 
[email protected]:$ 

per eseguire lo script.

Ciò non genera un errore ma nemmeno che attivano l'ENV virtuale

Quindi, qualsiasi suggerimento su come risolvere questo problema?

PS: Sto usando Ubuntu 11.04

+1

prova 'bash virtualenv_activate.sh' – arunkumar

+1

puoi compilarlo e postarlo come risposta. – Gautam

risposta

39

sh non è lo stesso di bash (anche se alcuni sistemi semplicemente collegano sh a bash, in modo da correre sh in realtà corre bash). Puoi pensare a sh come a una versione annacquata di bash. Una cosa che bash ha che sh non è il comando "source". Questo è il motivo per cui ottieni questo errore ... la sorgente gira bene nella tua shell bash. Ma quando si avvia lo script usando sh, si esegue lo script in una shell in un sottoprocesso. Poiché lo script è in esecuzione in sh, "source" non viene trovato.

La soluzione è quella di eseguire lo script in bash, invece. Modificare la prima riga per ...

#!/bin/bash 

Poi correre con ...

./virtualenv_activate.sh 

... o ...

/bin/bash virtualenv_activate.sh 

Edit:

Se si desidera l'attivazione di virtualenv per modificare la shell da cui si chiama lo script, è necessario usa la "fonte" o "operatore punto". Questo assicura che lo script viene eseguito nella shell corrente (e quindi cambia il contesto attuale) ...

source virtualenv_activate.sh 

... o ...

. virtualenv_activate.sh 

Come nota laterale, questo è perché virtualenv dice sempre che devi usare "source" per eseguire il suo script di attivazione.  

+1

o utilizzare l'equivalente di shell borne di origine, ad esempio '. envFile', spesso indicato come 'dot the envFile'. Buona fortuna ;-) – shellter

+1

Grazie, ma questo non sembra risolvere il problema, quando uso bash non genera un errore ma non attiva neanche il virtualenv. Potresti per favore elaborare .envFile – Gautam

+5

Quando esegui questi script come ho mostrato, in realtà crea una NUOVA shell, ed esegue lo script in quella shell. Poiché l'intero punto dello script "sorgente" è quello di cambiare la shell corrente, ciò vanifica lo scopo. Esegui il tuo script usando "source virtualenv_activate.sh" o ". Virtualenv_activate.sh" (nota lo spazio dopo quel primo periodo). –

3

source è un comando shell incorporato in bash e non è disponibile in sh. Se ricordo bene, allora env virtuale fa un sacco di manipolazione di variabili di percorso e ambiente. Anche eseguirlo come bash virtualenv_blah.sh non funzionerà poiché questo semplicemente creerà l'ambiente all'interno della sub-shell.

Provare . virtualenv_activate.sh o source virtualenv_activate.sh in questo modo viene eseguito lo script nel proprio ambiente corrente e tutte le variabili di ambiente modificate dall'attivazione di virtualenv saranno disponibili.

HTH.

Edit: Ecco un link che potrebbe aiutare - http://ss64.com/bash/period.html

4

Su Mac OS X le vostre proposte non sembra lavorare.

L'ho fatto in questo modo. I'am non molto felice con la soluzione, ma condividono lo stesso qui e di speranza, che forse qualcuno suggerirà la migliore:

In activate.sh ho

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

dò i permessi di esecuzione da: chmod +x activate.sh

E io eseguo questo modo:

`./activate.sh` 

si noti che ci sono paranthesis in forma di codice ASCII 96 = `(Grav e accento)

Problemi correlati