2012-10-29 7 views
51

Jak utworzyć skrypt Bash do aktywacji Python virtualenv?Jak pobierać źródło virtualenv aktywować w skrypcie Bash

mam struktura katalogów jak:

.env 
    bin 
     activate 
     ...other virtualenv files... 
src 
    shell.sh 
    ...my code... 

mogę aktywować virtualenv przez:

[email protected]:src$ . ../.env/bin/activate 
(.env)[email protected]:src$ 

Jednak robi to samo ze skryptu bash robi nic:

[email protected]:src$ cat shell.sh 
#!/bin/bash 
. ../.env/bin/activate 
[email protected]:src$ ./shell.sh 
[email protected]:src$ 

Co robię źle?

+0

To pytanie wygląda podobnie: http://stackoverflow.com/questions/192292/bash-how-best-to-include-other-scripts. Sprawdź, czy podane tam rozwiązania pomogą ci w twoim przypadku. –

+4

Po uruchomieniu skryptu powłoki faktycznie tworzysz nową powłokę. Celem użycia 'source' jest zmiana czegoś w bieżącej powłoce. Możesz użyć pythona virtualenv używając pełnej ścieżki './Env/bin/python'. –

+0

@NgureNyaga, Nie, to pytanie nie jest takie samo jak moje. Pytają, jak uzyskać źródło z dowolnej lokalizacji. Już wiem, jak to zrobić. Pytam, jak znaleźć źródło w niestandardowym skrypcie bash i zachować źródło. – Cerin

Odpowiedz

41

Gdy źródło, jesteś ładowania skryptu aktywacyjnego do aktywnej powłoki.

Kiedy robisz to w skrypcie, należy załadować go w tej powłoce, która wychodzi gdy skrypt kończy i jesteś z powrotem do swojego pierwotnego, nieaktywnym powłoki.

Najlepszym rozwiązaniem byłoby, aby to zrobić w funkcji

activate() { 
    . ../.env/bin/activate 
} 

lub aliasu

alias activate=". ../.env/bin/activate" 

nadzieję, że to pomaga.

+0

dla windows c: \ tutorial>. \ Env \ Scripts \ activate – max4ever

+2

Nie miałem absolutnie pojęcia, co się dzieje, gdy robię źródło To znacznie zmieniło moje skrypty bash na lepsze. Dziękuję Ci! –

+0

Twój pomysł na alias działał również dla mnie. Po prostu notka: Musiałem ją umieścić (alias abcdef = "source .../bin/activate") w moim skrypcie .zshrc (lub .bashrc dla użytkowników bash), aby działał. – shahins

6

Sourcing uruchamia polecenia powłoki w bieżącej powłoce. Kiedy źródło znajduje się w skrypcie, tak jak powyżej, wpływasz na środowisko dla tego skryptu, ale kiedy skrypt się kończy, zmiany środowiska są cofane, ponieważ skutecznie wykraczają poza zakres.

Jeśli zamiarem jest uruchomienie poleceń powłoki w virtualenv, można to zrobić w skrypcie po pozyskiwania skrypt aktywować. Jeśli twoim intencją jest interakcja z powłoką wewnątrz virtualenv, możesz utworzyć w skrypcie sub-powłokę, która odziedziczy środowisko.

-1

Do czego służy pozyskiwanie skryptu Bash?

  1. Jeśli zamierzasz przełączać się między wieloma virtualenvs lub wprowadzić jeden virtualenv szybko, czy próbowałeś virtualenvwrapper? Zapewnia wiele narzędzi, takich jak workon venv, mkvirtualenv venv i tak dalej.

  2. Jeśli po prostu uruchomić skrypt Pythona w niektórych virtualenv, użyj /path/to/venv/bin/python script.py, aby go uruchomić.

12

Chociaż nie dodaje prefiksu "(.env)" do wiersza powłoki, stwierdziłem, że ten skrypt działa zgodnie z oczekiwaniami.

#!/bin/bash 
script_dir=`dirname $0` 
cd $script_dir 
/bin/bash -c ". ../.env/bin/activate; exec /bin/bash -i" 

np.

[email protected]:~/src$ which pip 
/usr/local/bin/pip 
[email protected]:~/src$ which python 
/usr/bin/python 
[email protected]:~/src$ ./shell 
[email protected]:~/src$ which pip 
~/.env/bin/pip 
[email protected]:~/src$ which python 
~/.env/bin/python 
[email protected]:~/src$ exit 
exit 
+3

z technicznego punktu widzenia spawasz podpowłokę. To niekoniecznie jest problem, ale powinieneś przeliterować to dla OP. – richo

+13

Cerin * jest * OP ;-) – zigg

+0

Oh .. Powinienem przeczytać więcej najpierw. Mój błąd! – richo

18

Powinieneś wywołać skrypt bash używając źródła.

Oto przykład:

#!/bin/bash 
# Let's call this script venv.sh 
source "<absolute_path_recommended_here>/.env/bin/activate" 

Na powłoce prostu nazwać tak:

> source venv.sh 

Albo jak @outmind zaproponował: (Zauważ, że to nie działa z zsh)

> . venv.sh 

W tym miejscu wskazanie powłoki zostanie umieszczone na monitorze.

+1

lub nawet tylko ". Venv.sh" – outmind

+1

. nie działa na zsh, użyj źródła. – 3manuek

+0

Bez względu na to, co próbuję, to 'source/home/surest/Desktop/testservers/TEST_VENV/venv3/bin/activate" 'produkuje:' /home/surest/Desktop/testservers/TEST_VENV/py3.sh: 10:/home/surest/Desktop/testservers/TEST_VENV/py3.sh: source: not found' –

Powiązane problemy