python 版本

手段:rm -rf /usr/bin/python

ln -s /usr/bin/python2.6 /usr/bin/python

python -V 

即可



反映的问题




以上这几篇帖子、文章和我的实践反映了一个问题:将自己安装的版本设置为系统默认版本只需要改变/usr/bin/python的链接指向即可,但要想恢复系统默认版本,使/usr/bin/python的链接指向恢复原状却不够。
因为默认的python版本被变更,很多依赖系统自带版本python的软件运行出错了,有人开始病急乱投医,结果搞得一团糟。
当安装一个新的python时发生了什么?


4份程序的差异


来看一下我的系统中存在的4份程序有什么差异?
自定义编译安装的2.5、2.7两份程序相对系统自带的程序要简单一些(加载模块少),直接表现是调用的文件比较少;
自定义编译安装的程序库文件存放于/usr/lib目录,而系统自带的程序库文件存放于/usr/自定义路径/lib目录;
各个版本程序只要是安装在公共目录,如/usr、/usr/local,子目录的命名都体现了版本号,所以只要不是强制重新编译安装同版本python到与系统自带版本相同的目录,应该不会出现系统自带版本被覆盖的情况;
多版本和谐相处


所以,安装此版本导致彼版本失效甚至被覆盖,其发生几率是很小的;因为每个版本都会将其内容分存在以其版本号命名的目录下,然后存放到/usr/lib、/usr/include、/usr/share或者/usr/local/lib、/usr/local/include、/usr/local/share等目录下。
问题只在于哪个版本被设置为系统默认调用的版本了;而当某个版本被设为默认时,另一版本的可用性并不受影响。如果需要调用非系统默认版本的python,只需加上版本号就可以了,例如以python2.5运行GAE上传模块:
sudo python2.5 appcfg.py update xxx
默认python版本由谁决定


两个文件?


通常的说法是/usr/bin/python这个软链接的指向决定了系统默认调用的python版本,这在某些情形下可能是正确的,但这情形显然不具有一般性;否则,就不会有那么多网友反映在撤销建立新软链接的操作后,他们的系统并没有恢复最初的默认版本,也不会有大牛们警告说“在任何情形下都不要进行改变系统默认版本之类的操作,否则出了问题只能重装python”。
所以,似乎发生了一些什么,使得/usr/bin/python这个软链接的指向决定系统默认python版本的功用失效了,有其他一个文件部分或全部替代了它的功能。
另一个文件在哪?


那么新的switch在什么地方呢?在我的实例中,既然将/usr/bin/python指向上述四个版本的任一个,系统都仍然以2.5为默认版本,那么这个switch必然始终被指向了/usr/local/bin/python2.5。它会不会是/usr/local/bin/python?我试着将/usr/local/python27/bin/python链接到/usr/local/bin/python,再次运行python -V,成功了!
事实如此


事后查找资料、分析这个问题,发现其实很简单,python、python-config在/usr/bin和/usr/local/bin目录下各有一份,而系统是优先使用后者的,因对linux软件管理机制缺乏了解,也因网文多数只讲/usr/bin/python,不讲/usr/local/bin/python的误区,我原来至少犯了以下三个错误:
认为/usr/local/bin/python和/usr/local/bin/python-config是编译、安装2.5版本时生成的,而非本有的;
不知道/usr/local/bin/python的作用;
不知道/usr/local/bin/python的优先级高于/usr/bin/python;
完全解决问题


前面我将/usr/local/bin/python指向了自定义安装的python2.7版本,但这个版本其实废柴,因为比起系统自带的2.7版本,它太单薄了(从前面相关目录对比可以看出),也没有什么特色。所以继续操作,将/usr/local/bin/python链接指向/usr/bin/python2.7,完成这个软链接后,运行python -V已经提醒正在使用2.7版本了。
可是如果运行基于python的一些程序,如apt-get、tweak等,仍然会报错,提醒你/usr/bin/python没有被指向系统自带的2.7版本,看来/usr/bin/python并没有失去作用,只是在解决了/usr/local/bin/python的链接指向问题后,它的问题凸显了。
于是,我同时更改/usr/bin/python指向/usr/bin/python2.7。之后,系统各组件、软件的运行都恢复正常。看来/usr/bin/python和/usr/local/bin/python的指向分别承担了不同的作用,两相配合才能使系统正常运转。
反思


我最初安装python2.5时,并没有做过更改/usr/local/bin/python指向的操作,甚至将/usr/bin/python软链接到了一个无效位置,可系统仍以2.5为默认版本,看来诸如/usr/local/bin/python的链接被更改等动作是自动发生的。
再细想,为什么后来安装2.7版本系统没有自动将其设为默认版本呢,对比两次编译、安装,区别主要在安装路径是默认还是自定义上。所以,可以做以下三点推断:
自定义安装python时,安装到默认路径或指定一个路径是不同的,前面情形下系统会将新安装设为默认版本,后者则不会;
完成设置默认python版本需要两步:分别更改/usr/local/bin/python和/usr/bin/python的指向,如果自定义安装某版本python到默认路径(/usr/local),第一个软链接已被设置好,只需更改第二个;但如果要改回系统自带的默认版本,则需要同时更改/usr/local/bin/python和/usr/bin/python;
如果只更改/usr/local/bin/python的指向,在terminal运行python时发现它已是新变更的版本,可是系统的一些基本组件却可能仍在使用旧版本,例如ubuntu的apt-get,fedora的yum;
附录1:一些常用的命令


查看Python当前的安装目录


qi@qi-desktop:~$ pythonPython2.5.2(r252:60911,Sep292011,11:58:06)[GCC 4.5.2] on linux2Type"help","copyright","credits"or"license"for more information.>>>import sys>>>print sys.path['','/usr/local/lib/python25.zip','/usr/local/lib/python2.5','/usr/local/lib/python2.5/plat-linux2','/usr/local/lib/python2.5/lib-tk','/usr/local/lib/python2.5/lib-dynload','/usr/local/lib/python2.5/site-packages']
查看确认当前的python版本


可以通过which python查看python安装或设置的位置,通过python -V查看当前所用版本:
qi@qi-desktop:~$ which python/usr/local/bin/pythonqi@qi-desktop:~$ python -VPython2.7.2+
更改默认版本链接


这是网上转传较多的说法:
python这个命令实际上是一个连接, 比如我的:
[allblue@MyLady fs]$ ll /usr/bin/pythonlrwxrwxrwx 1 root root 74月1519:29/usr/bin/python -> python3
想改的话很容易:
sudo ln -s /usr/bin/python3.1/usr/bin/python
就可以了。不过建议在更改之前通过命令:
sudo update-alternatives --config python
查看一下可使用的更高版本,确认目前所用的是不是最高版本。
附录2:编译、安装python,加载常用模块的方法


由于要在linux中使用python 2.5版本,结果Ubuntu 10.04默认版本为2.6,因此要安装2.5版本,并将其默认编译器改为2.5版本的。下面是主要步骤:
编译安装


下载源代码


wget http://www.python.org/ftp/python/2.5.2/Python-2.5.2.tar.bz2
解压压缩包


$ tar –jxvf Python-2.5.2.tar.bz2
安装python 2.5


$ cd Python-2.5.2$ ./configure$ make$ make install
安装完成后,输入python,验证其安装成功与否。
修改默认版本


$ cd /usr/bin$ ll |grep python //查看该目录下python    qi@qi-desktop:/usr/bin$ ll |grep python    lrwxrwxrwx  1 root   root          92011-04-2821:40 python -> python2.7*$ rm -rf python$ ln -s 安装目录前缀/Python-2.5.2/python ./python //可能需要root权限,可用sudo ...    qi@qi-desktop:/usr/bin$ sudo ln -s ~/program/google_appengine/Python-2.5.2/python ./python$ python -V
至此,版本就修改完毕,变成了2.5.2了。也可以通过下面的示例查看:
qi@qi-desktop:/usr/bin$ ll |grep pythonlrwxrwxrwx  1 root   root         532011-09-2910:03 python ->/home/qi/program/google_appengine/Python-2.5.2/python*
安装所需模块


为Python安装zlib模块


安装python后运行时提示zlib找不到。这是因为编译python前没有安装zlib。如下为安装步骤:
第一次失败


到zlib主页下载包(http://www.gzip.org/zlib),编译、安装:
tar xfz zlib-1.1.4.tar.gzcd zlib-1.1.4./configuremakemake install
之后,
You should end up with a ‘zlib.h’ file in your system.In mine,Ubuntu, I have /usr/include/zlib.h.
第二次成功


再到Python的目录,make clean,编译(使用共享方式编译),安装;
./configure –with-zlib=/usr/includemake && make install
验证:
qi@qi-desktop:~/program/google_appengine$ pythonPython2.5.2(r252:60911,Sep292011,10:39:40)[GCC 4.5.2] on linux2Type"help","copyright","credits"or"license"for more information.>>>import zlib
没有错误信息说明编译成功。
为Python安装sqlite模块


承上,尝试加载此模块时,提示:
>>>import sqlite3Traceback(most recent call last):File"", line 1,inFile"/usr/local/lib/python2.5/sqlite3/__init__.py", line 24,infrom dbapi2 import*File"/usr/local/lib/python2.5/sqlite3/dbapi2.py", line 27,infrom _sqlite3 import*ImportError:Nomodule named _sqlite3>>>exit()
再次提示没有sqlite,需要安装。如下为安装步骤:
1、到squlite主页下载软件包:http://www.sqlite.org/download.html
2、安装sqlite3;如果要安装到用户指定目录,可以:
$./configure --prefix=/your/path/
3、重新安装python如果要安装到指定目录,可以使用prefix,
$./configure --prefix=/your/path/
4、检测安装是否成功
>>import sqlite3
附录三:GAE在python环境下的运行


一些输出信息的简单解释:
//关于runtime environment版本Warning:You are using a Python runtime (2.7) that is more recent than the production runtime environment (2.5).Your application may use features that are not available in the production environment and may not work correctly when deployed to production.//关于Djangp版本WARNING  2011-10-0601:56:48,188 __init__.py:97]You are using the defaultDjango version (0.96).ThedefaultDjango version will change in an AppEngine release in the near future.Please call use_library() to explicitly select a Django version.For more information see http://code.google.com/appengine/docs/python/tools/libraries.html#Django//缺乏module的错误ERROR    2011-10-0601:56:48,303 dev_appserver.py:4200]Exception encountered handling requestFile"/usr/lib/python2.7/io.py", line 60,inimport _ioImportError:Nomodule named _io//关于runtime environment版本Warning:You are using a Python runtime (2.6) that is more recent than the production runtime environment (2.5).Your application may use features that are not available in the production environment and may not work correctly when deployed to production.//关于数据存储WARNING  2011-10-0601:52:00,184 datastore_file_stub.py:512]Couldnot read datastore data from/tmp/dev_appserver.datastore//关于Djangp版本WARNING  2011-10-0601:52:09,487 __init__.py:97]You are using the defaultDjango version (0.96).ThedefaultDjango version will change in an AppEngine release in the near future.Please call use_library() to explicitly select a Django version.For more information see http://code.google.com/appengine/docs/python/tools/libraries.html#Django//关于文件读取WARNING  2011-10-0601:52:10,055 dev_appserver.py:1414]Blocking access to skipped file "/home/qi/program/google_appengine/upload/micolog/plugins/save_remote_images.pyc"WARNING  2011-10-0601:52:10,055 dev_appserver.py:1414]Blocking access to skipped file "/home/qi/program/google_appengine/upload/micolog/plugins/tagCloud.pyc"WARNING  2011-10-0601:52:10,055 dev_appserver.py:1414]Blocking access to skipped file "/home/qi/program/google_appengine/upload/micolog/plugins/__init__.pyc"WARNING  2011-10-0601:52:10,055 dev_appserver.py:1414]Blocking access to skipped file "/home/qi/program/google_appengine/upload/micolog/plugins/RandomPostsWidget.pyc"WARNING  2011-10-0601:52:10,078 dev_appserver.py:1414]Blocking access to skipped file "/home/qi/program/google_appengine/upload/micolog/plugins/akismet.pyc"WARNING  2011-10-0601:52:10,079 dev_appserver.py:1414]Blocking access to skipped file "/home/qi/program/google_appengine/upload/micolog/plugins/wap.pyc"//关于文件读取,临时性错误ERROR    2011-10-0520:52:10,399 zip_loader.py:15]Can't open zipfile /home/qi/program/google_appengine/upload/micolog/themes/default.zip: [Errno 2] No such file or directory: '/home/qi/program/google_appengine/upload/micolog/themes/default.zip'//关于SSL的缺乏WARNING  2011-10-06 01:53:11,683 urlfetch_stub.py:108] No ssl package found. urlfetch will not be able to validate SSL certificates
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值