不論是java還是c++,都有庫依賴的問題,c++中叫dll hell,java中也有類似的現象,java也存在不同版本編譯的runtime報錯問題。既然這些語言都有,那么python也不例外,只是python的現象更嚴重一些。2.x和3.x語法不兼容,庫依賴就更不兼容了。而linux和mac osX都有預裝的python版本,如果不注意的話,就會出現程序A依賴庫Lib1,而程序B依賴庫Lib2,導致不兼容。或者是系統是2.7的python,但是你想用3.5,這類問題是很頭疼的。所以你需要pyenv和virtualenv來解決這些wtk的問題。
pyenv,按規矩先貼地址:https://github.com/pyenv/pyenv/,它能管理多個python版本,并且還能實現版本間的切換,還不影響系統中已有的版本。
virtualenv,按規矩再貼地址:https://github.com/pyenv/pyenv-virtualenv/,注意我貼的不是原始的virtualenv,而是pyenv配合使用的。virtualenv是包管理工具,也就是庫管理工具。它能解決的是各種庫之間的沖突。
一句話就是,pyenv用來管理python自身的版本,virtualenv用來管理某個python環境下的包。這樣就能解決文章開頭提到的問題。具體原理這里就不解釋了,篇幅有限。
下面來說一下安裝,mac osX下的安裝用brew就可以了:
brew install pyenv
brew install pyenv-virtualenv
安裝完成以后,還有一個事情要注意,pyenv安裝python環境的時候有一些庫依賴要安裝。如果不清楚要裝哪些就等報錯以后再一個一個裝好了。比如我遇到的錯誤就是這樣:
https_proxy=socks5://127.0.0.1:1086 pyenv install 3.5.3·
Downloading Python-3.5.3.tar.xz...
-> https://www.python.org/ftp/python/3.5.3/Python-3.5.3.tar.xz
Installing Python-3.5.3...
**BUILD FAILED** (OS X 10.12.4 using python-build 20160602)
Inspect or clean up the working tree at /var/folders/w4/l6gnykmn5nn04r1l4ply4q340000gn/T/python-build.20170513141638.4369
Results logged to /var/folders/w4/l6gnykmn5nn04r1l4ply4q340000gn/T/python-build.20170513141638.4369.log
Last 10 log lines:
File "/private/var/folders/w4/l6gnykmn5nn04r1l4ply4q340000gn/T/python-build.20170513141638.4369/Python-3.5.3/Lib/ensurepip/__main__.py", line 4, in <module>
? ensurepip._main()
File "/private/var/folders/w4/l6gnykmn5nn04r1l4ply4q340000gn/T/python-build.20170513141638.4369/Python-3.5.3/Lib/ensurepip/__init__.py", line 209, in _main
? default_pip=args.default_pip,
File "/private/var/folders/w4/l6gnykmn5nn04r1l4ply4q340000gn/T/python-build.20170513141638.4369/Python-3.5.3/Lib/ensurepip/__init__.py", line 116, in bootstrap
? _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
File "/private/var/folders/w4/l6gnykmn5nn04r1l4ply4q340000gn/T/python-build.20170513141638.4369/Python-3.5.3/Lib/ensurepip/__init__.py", line 40, in _run_pip
? import pip
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1
大家看到上面是加了代理的,不加代理的話pyenv和pip安裝非常慢,由于眾所周知的原因,這里就不解釋了。當然也可以選擇使用國內的一些pip鏡像,但因為國內的鏡像老是短命,現在我還是更傾向于使用代理。
mac下還要執行一句話:
xcode-select --install
現在開始安裝python3.5
pyenv install —list
列出所有可選的python環境,我想安裝3.5,然后:
192:zyctd shihuaping$ https_proxy=socks5://127.0.0.1:1086 pyenv install 3.5.3
Downloading Python-3.5.3.tar.xz...
-> https://www.python.org/ftp/python/3.5.3/Python-3.5.3.tar.xz
Installing Python-3.5.3...
Installed Python-3.5.3 to /Users/shihuaping/.pyenv/versions/3.5.3
好,安裝成功。然后切換到3.5.3,如果不手工切換,仍然是使用的系統的版本。
pyenv local 3.5.3
到此為止,解決了python版本的問題。