virtualenv是一个python工具. 它可以创建一个独立的python环境. 这样做的好处是你的python程序运行在这个环境里, 不受其它的 python library的版本问题影响. 比如说你想用最新的Django 1.3开发新的项目, 但是现有的Pinax 0.7只支持到Django 1.1. 传统的做法是在环境变量PYTHONPATH里明确地规定程序包的目录. 这么做没什么不好, 而且很清晰. 问题出在以后如果你有需要写别的程序时调用了新的版本, 或者是别的程序员升级了包, 很容易把你的程序也搞垮.
其实我对virtualenv一开始没什么兴趣. 为什么呢? 首先我认为virtualenv也不是完美的解决方案, 它只是一个以空间换时间的方法. 可能是受了ant/maven的影响, 我觉得那样更省事一些. 更主要的原因是我很懒, 又不肯学新的东西. 因为学新的东西是要时间的, 学了一样的新知识后还没怎么用更新的东西就又出来了. 这不是学了白学嘛. 所以我把这些工具分成两类. 一种是可以解决新的问题, 另一种是改进当前的解决方法. 我对前一种的态度是没碰到那类问题就不仔细学习, 了解一下就好. 对后一种就要小心一些, 因为这类方法往往有可能存在过度设计的问题, 也就是说理论上它有可能解决得更好一些, 但学习的时间成本更高, 复杂度也更高, 有可能会得不偿失. 所以我会先看看它是不是足够简单, 否则就不学.
virtualenv充分利用了pip. 对于pip, 我以前读James Bennett的文章 "On packaging" 时就不大以为然. 虽然我一直特尊敬James, 他的博客曾是我学Django的最大帮助, 但这篇文章我觉得只是个人喜好. pip和setuptools相比带来的好处实在有限.
但是virtualenv比pip更进了一步. 它的定位相当于Java里的Maven 和最新的ant. 我以前对版本问题不是很在意, 因为我自己只是一个人写程序, 也一直用最新的程序版本. 但是最近的Django1.2出来以后出现了版本不兼容的问题, 而且我用了不少别人的库, 这些程序也出现了版本不兼容的问题. 我在开发机器上测试新的东西出现问题还能接受, 但是到了production环境上就不行了. 全面升级时总是麻烦事. 所以我觉得现在是到了用virtualenv的时候了.
Installation
要是你的Linux repository已经有了virtualenv, 那当然可以直接安装, 例如Ubuntu 10.04,
sudo aptitude install python-virtualenv
要是没有, 如Ubuntu 8.04,
sudo easy_install virtualenv Installing virtualenv script to /usr/bin Installed /usr/lib/python2.5/site-packages/virtualenv-1.5.1-py2.5.egg
如果在share hosting上, 要麻烦一些:
1. #need to setup python in your own folder under your home folder, mkdir -p python2.6/{bin,include,share,lib/python2.6/site-packages} 2. # get virtualenv package wget http://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.6.4.tar.gz tar zxvf virtualenv-1.6.4.tar.gz cd virtualenv-1.6.4 /usr/local/bin/python2.6 setup.py install \ --prefix=/home/your_user_name/python2.6/
Setup
创建一个工作环境mysite
virtualenv mysite cd mysite source bin/activate
这时你就发现多了一个环境变量VIRTUAL_ENV. virtualenv还修改了$PATH, 增加了bin/python, 这样以后的pythonpath就优先指定到当前目录环境里. virtualenv还在ENV/bin里安装了pip. 以后再安装新的python包就都装到这下面了, 如pip install html5lib.
清除工作环境
virtualenv --clear mysite
相关工具
virtualenvwrapper 的作用是管理多个不同的虚拟环境, 让创建/删除/拷贝/切换不同工作环境更加方便一些.
installation: sudo pip install virtualenvwrapper
virtualenvwrapper doc
quick tips:
export WORKON_HOME=~/sites source /usr/local/bin/virtualenvwrapper.sh mkvirtualenv env1 mkvirtualenv env2 workon env1 echo $VIRTUAL_ENV
http://log4d.com/2011/11/python-version-script
Linux下Python版本切换脚本
Posted on 2011年11月18日 by alswl
Update 2012-01-01:
请忽略本文,更好的切换版本请使用virtualenv+virtualenvwrapper,回头我会写一篇两者的介绍文章。
公司环境使用Python2.7作为开发版本,GAE需要Python2.5作为开发版本,Arch这个更新狂又自动升级Python版本到3.2。
我之前想找一个Python版本切换的小工具,结果没找到合适的,今天在调GAE的时候,就自己写了一个小脚本。
#!/bin/bash
#FILENAME: trackPointScrolling.sh
#DESC: 切换pytohn版本
#AUTHOR: alswl
#DATE: 2011-11-18
PYTHON=/usr/bin/python
PYTHON25=/usr/local/python2.5/bin/python2.5
PYTHON27=/usr/bin/python2.7
PYTHON3=/usr/bin/python3
if [ $# != 1 ] ; then
echo 参数错误,正确参数为 '5/7/3'
exit
fi
if [ $1 == '5' ]; then
ln -fs $PYTHON25 $PYTHON
elif [ $1 == '7' ]; then
ln -fs $PYTHON27 $PYTHON
elif [ $1 == '3' ]; then
ln -fs $PYTHON3 $PYTHON
else
echo 错误的参数: "$1"
fi
echo 当前Python版本:
echo `python --version`
使用的时候要先修改一下PYTHON25/PYTHON27/PYTHON3指向的位置,然后这个脚本会在/usr/bin/pytohn创建对应的软链接。
我建议把不同版本的Python安装到/usr/local/pythonxx/下面去,以后卸载比较方便,省得去一点点rm。
我又卖弄自己少的可怜的Linux知识了,哈哈。
版权所有 © 2010 转载本站文章请注明: 转载自Log4D
原文链接: http://log4d.com/2011/11/python-version-script
您可以随意地转载本站的文章,但是必须在醒目位置注明来源及本站链接,不可以将本站文章商业化使用,或者修改、转换或者以本作品为基础进行创作。
3a1ff193cee606bd1e2ea554a16353ee
from http://c2.teckoo.com/blog/django/virtualenv.html
======================================================
Virtualenvs with different interpreters
Update 2011-09-27: Turns out virtualenv and virtualenvwrapper support this out of the box. Most of what’s written below is horrifically complex compared to just using the -p switch when you make your virtualenv. You simply need to do this:
$ mkvirtualenv -p /path/to/some/python coolname
That’ll create a new virtualenv called “coolname” that uses /path/to/some/python for it’s Python interpreter. I’ve tested this with PyPy and it worked great.
I don't get the hook_loader error, but it's complaining about lack of DEST_DIR $ mkvirtualenv --python /opt/local/bin/python2.7 Running virtualenv with interpreter /opt/local/bin/python2.7 You must provide a DEST_DIR – wmfox3 Jun 23 '11 at 3:04
Whoops, sorry--left out the key argument! That should be mkvirtualenv --python /path/to/python2.6 env_name. mkvirtualenv makes a folder called "env_name" in your $WORKON_HOME, which gets passed on to virtualenv as its DEST_DIR argument. Without specifying a name, it would have a hard time figuring out where to set things up, that's for sure. – Greg Haskins Jun 23 '11 at 4:48
Duh. I should have caught that. Yes, that worked. Guess the answer is to leave port select to python27 and run mkvirtualenv with the --python flag when I need to use something else. – wmfox3 Jun 25 '11 at 11:37
4 thoughts on “Linux下Python版本切换脚本”
Zhe says:
2011年11月18日 at 22:49
如果你用virtualenvwrapper的话
建立env时使用-p 指明python版本,
然后就可以随时用workon [env名]在不同版本间切换了。
我用virtualenv因为ubuntu包管理对python版本依赖很强。不知道arch里随便改默认python解释器的结果(以前用过一段时间,可惜没有坚持)。
回复
alswl says:
2011年11月19日 at 08:51
@Zhe Arch的依赖没有这么强,我更改Python版本之后,目前还没有出现问题。以前用Ubuntu时候,记得改了版本,会出现apt-get不能使用的情况。
我看了一下virtualenvwrapper文档,准备使用了。
感谢你的建议。
回复
Zhe says:
2011年11月18日 at 20:41
为什么不用virtualenv+virtualenvwrapper呢?
回复
alswl says:
2011年11月18日 at 22:44
@Zhe virtualenv我有在用,我用来管理公司/私人pytohn环境,还没有用来尝试管理python版本。
回复