2015-10-06 218 views
3

我試圖讓一個Django項目啓動並運行,並且我有Django運行,但是我遇到了python的virtualenv問題。Mac上的虛擬環境與python 3.4

這裏是我的錯誤(在終端打開此顯示出來)

/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python: No module named virtualenvwrapper 
virtualenvwrapper.sh: There was a problem running the initialization hooks. 

If Python could not import the module virtualenvwrapper.hook_loader, 
check that virtualenvwrapper has been installed for 
VIRTUALENVWRAPPER_PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python and that PATH is 
set properly. 

這裏是我的.bash輪廓看起來像:

# Setting PATH for Python 3.4 
# The orginal version is saved in .bash_profile.pysave 
PATH="/Library/Frameworks/Python.framework/Versions/3.4/bin:${PATH}" 
export PATH 

# Setting PATH for Python 2.7 
# The orginal version is saved in .bash_profile.pysave 
PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}" 
export PATH 

export WORKON_HOME=$HOME/.virtualenvs 
source  /Library/Frameworks/Python.framework/Versions/3.4/bin/virtualenvwrapper.sh 
export PIP_VIRTUALENV_BASE=$WORKON_HOME 
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi 

我非常新的命令行的東西和虛擬環境,所以我可能不知道我做錯了一些「明顯」的事情。謝謝。

+0

試評'PATH =「/庫/框架/ Python.framework /版本/ 2.7/bin中:$ {PATH}'下一行 –

+0

同樣的錯誤謝謝您的好意 – bwighthunter

+1

你試過指定哪個你的Python版本想用'mkvirtualenv --python /path/to/python3.4 venv_name'? – bkaf

回答

2

首先在命令行shell的一些基礎知識:

Path是包含文件系統的目錄列表的環境變量。當你輸入一個命令,如lspythonvirtualenvwrapper.sh你的shell將搜索從列出的第一個開始的每個目錄。要查看當前的PATH類型:

$ echo $PATH 
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin 

要查看一個給定的命令是要解決到將要運行的程序的位置,使用which命令:

$ which ls 
/bin/ls 

現在在你的例子中,你首先將Python 3.4位置添加到PATH,然後是Python 2.7位置。後者的位置將首先在您的PATH上。因此,所有與Python相關的命令都將首先嚐試運行Python 2.7,如果在那裏找不到命令,那麼它將在Python 3.4安裝中進行下一次搜索。

你似乎已經安裝virtualenvwrapper爲Python 3.4,但是當你從線路運行virtualenvwrapper.sh:

source  /Library/Frameworks/Python.framework/Versions/3.4/bin/virtualenvwrapper.sh 

你被明確運行安裝的Python 3.4 virtualenvwrapper.sh。這將運行在您的Python 2.7運行python命令,這似乎並沒有安裝virtualenvwrapper,見下面的錯誤消息:

/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python: No module named virtualenvwrapper 

如果你試圖消除了Python 2.7位置除了PATH和它沒沒有工作,你必須記住,你的.bash_profile的變化不會自動反映在你的終端。您必須創建新的終端會話,並且新會話將會讀取您的新的.bash_profile

如果您試圖讓命令virtualenv解析爲兩個不同的Pythons,那根本不可能。它將總是根據PATH上的位置順序解析爲一個特定的Python。 VirtualEnv會安裝替代版本的命令,並在名稱中內置Python版本。使用命令virtualenv-3.4virtualenv-2.7爲每個不同的Python創建虛擬環境。

所有這一切的關鍵是記住PATH用於解析這個程序運行的絕對路徑位置。使用echo $PATHwhich命令可幫助您瞭解如何解決最終路徑。

它可能看起來乏味,但打字了完整的絕對路徑總是會側步路徑解析的法寶:

$ /Library/Frameworks/Python.framework/Versions/2.7/bin/virtualenv 

試着用自己的方式來操控路徑,更小的步驟。只需使用virutalenv-3.4即可創建一個Python 3.4虛擬環境,並且僅在您需要時才引入virtualenvwrapper,並且在您對shell環境的理解更加紮實之後。

最後,即使親可以通過玩遊戲操縱路徑絆倒。你最終試圖獲得一堆不同的應用程序位置,並將它們全部壓縮到一個名稱空間中。在某些情況下,衝突可能變得無法解決。 Python安裝工具(例如Buildout)具有自己的學習曲線,但它會對它安裝的每個python腳本的python的絕對路徑進行硬編碼。硬編碼絕對路徑是處理極端情況的唯一方式,例如並行創建兩個Python 3.4版本,其中有兩個腳本,每個腳本需要在同一個Python的兩個不同版本上運行。硬編碼的絕對位置在生產環境中也是需要的,因爲那樣你的應用程序就不會受到對bash shell的任何改變的影響。如果您忘記PATH的必需訂購,或PATH的其他系統管理員,您不會發現應用程序意外中斷。