2012-10-29 233 views
51

如何創建Bash腳本來激活Python virtualenv?如何在Bash腳本中激活virtualenv激活

我有一個目錄結構,如:

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

我可以通過激活我的virtualenv:

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

然而,從bash腳本做同樣的無助:

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

我在做什麼錯?

+0

這個問題看起來類似:http://stackoverflow.com/questions/192292/bash-how-best-to-include-other-scripts。檢查那裏給出的解決方案是否有助於你的情況。 –

+4

當你運行一個shell腳本時,你實際上正在創建一個新的shell。使用'source'的要點是改變當前shell的內容。你可以使用完整路徑'。/ env/bin/python'來使用virtualenv的python。 –

+0

@NgureNyaga,不,那個問題跟我的不一樣。他們問如何從任意位置獲取信息。我已經知道如何做到這一點。我在問如何在自定義bash腳本中進行源代碼並維護源代碼。 – Cerin

回答

41

當您來源時,您正在將激活腳本加載到活動shell中。

當您在腳本中執行此操作時,會將其加載到該腳本中,當腳本結束並退回原始未激活的shell時退出該腳本。

你最好的辦法是做一個函數

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

或別名

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

希望這有助於。

+0

for windows c:\ tutorial>。\ env \ Scripts \ activate – max4ever

+2

我完全不知道這是我在做源代碼時發生了什麼 這大大地改變了我的bash腳本。謝謝! –

+0

你的別名想法也適合我。請注意:我必須在我的.zshrc腳本(或bash用戶的.bashrc)中放置它(別名abcdef =「source .../bin/activate」)才能使用。 – shahins

6

Sourcing在當前shell中運行shell命令。當您在腳本內部進行上述操作時,您正在影響該腳本的環境,但是當腳本退出時,環境更改將被撤消,因爲它們實際上已超出範圍。

如果您的目的是在virtualenv中運行shell命令,那麼可以在獲取激活腳本後在腳本中執行該命令。如果您的意圖是與virtualenv中的shell進行交互,那麼您可以在腳本內產生一個可以繼承環境的子shell。

-1

尋找bash腳本是爲了什麼?

  1. 如果您打算在多個virtualenvs之間進行切換或迅速進入一個virtualenv中,你嘗試過virtualenvwrapper?它提供了很多使用例如workon venv,mkvirtualenv venv等等。

  2. 如果您只是在特定的virtualenv中運行python腳本,請使用/path/to/venv/bin/python script.py來運行它。

12

儘管它不會在shell提示符中添加「(.env)」前綴,但我發現這個腳本按預期工作。

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

例如

[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

在技術上你正在產生一個子殼。這不一定是個問題,但你應該爲OP做好準備。 – richo

+13

Cerin *是* OP ;-) – zigg

+0

哦..我應該先閱讀更多內容。我的錯! – richo

18

您應該使用源代碼調用bash腳本。

下面是一個例子:

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

在你的shell只是把它這樣的:

> source venv.sh 

或者爲@outmind建議:(請注意,這不符合zsh的工作)

> . venv.sh 

你走了,殼指示將被放置在你的提示。

+1

或甚至只是 「venv.sh」 – outmind

+1

。在zsh上不起作用,請使用source。 – 3manuek

+0

無論我嘗試什麼,這個'source「/ home/surest/Desktop/testservers/TEST_VENV/venv3/bin/activate」'產生:'/home/surest/Desktop/testservers/TEST_VENV/py3.sh:10:/ home/surest/Desktop/testservers/TEST_VENV/py3.sh:source:not found' –