不论是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版本的问题。