系統默認Python版本更換後的依賴解決問題

2012-06-24 13:48:14 +08:00
 mckelvin
不知道這個標題能不能正確表達我的意思。具體的情況是如下這樣的:
我的PC的操作系統是Archlinux,默認/usr/bin/python的版本是2.7的。公司的開發Python環境是2.6的,爲了兼容考慮我用yaourt(Archlinux下的包管理工具)安装了一个Python2.6

sudo yaourt -S python26

并将/usr/bin/python和python2链接到/usr/bin/python2.6

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

但是这样之后系统中原本依赖python2.7的程序有些就不能跑了,我想应该是这些程序的依赖python2.7的lib中的某些模块,而python2.6中没有这些模块。比如典型的症状是尝试运行Gnome3下的菜单管理工具alacarte会提示:

[kelvin@kelvinpc ~]$ alacarte
Traceback (most recent call last):
File "/usr/bin/alacarte", line 22, in <module>
from Alacarte.MainWindow import MainWindow
ImportError: No module named Alacarte.MainWindow

上面我的分析思路應該沒什麼問題吧?這樣的問題應該如何正確處理呢?

先謝!
4663 次点击
所在节点    Python
11 条回复
ayanamist
2012-06-24 14:48:10 +08:00
干嘛要更换默认的Python版本?
这就是项目不用virtualenv的悲剧。
用virtualenv能解决你所有的问题。
phuslu
2012-06-24 15:32:30 +08:00
pythonbrew
lwjefSub
2012-06-24 15:46:28 +08:00
@ayanamist virtualenv 能切版本的吗 =。= 不是只能隔离库吗
ayanamist
2012-06-25 13:17:02 +08:00
@lwjefSub 能在创建env的时候,指定使用哪个Python,甚至可以指定为PyPy。具体请仔细阅读virtualenv的文档。
csx163
2012-06-25 13:21:15 +08:00
取消链接
把你们公司的文件头部改为这样#!/usr/bin/env python26
然后安装alacarte模块用 python26 setyp.py install
mckelvin
2012-06-25 16:47:49 +08:00
试了下pythonbrew,貌似比virtualenv更便于多版本切换。用过virtualenv,还是会出现些bug,和pythonbrew一样,两者都是控制current shell里的python版本,公司代码比较庞大,不确定virtualenv能不能保证里面所有依赖都使用指定环境,或者是下面这样的尴尬情况

[kelvin@kelvinpc ~]$ which python
/usr/bin/python
[kelvin@kelvinpc ~]$ which python2
/usr/bin/python2
[kelvin@kelvinpc ~]$ pythonbrew switch 2.6.6
Switched to Python-2.6.6
[kelvin@kelvinpc ~]$ which python
/home/kelvin/.pythonbrew/pythons/Python-2.6.6/bin/python
[kelvin@kelvinpc ~]$ which python2
/usr/bin/python2

还因为一个叫pyhash(pip install pyhash)的依赖有些问题,直接开发机上写了,改天再折腾看看。

LZ小白,欢迎指正。
road2stat
2012-06-25 16:53:58 +08:00
「所谓的 python 是 python3,而 python2 其实是 python,至于 python-2.6.6,那又是另一个故事了 。。。」
mckelvin
2012-06-25 19:26:14 +08:00
@road2stat 这不会是archlinux独有的方式吧?
瓣瓣的code头里各种

#!/usr/bin/env python

按这样的标准来应该

#!/usr/bin/env python2

才是
bcxx
2012-06-25 19:38:18 +08:00
@mckelvin archlinux python 是 python3
road2stat
2012-06-25 21:33:21 +08:00
@mckelvin 是的。Arch 中符号 python 是语义上的 python3,而用符号 python2 表示语义上的 python2 。。。其他发行版一般默认版本还是 2.x 吧,语义上的 python2 用符号 python 表示,语义上的 python3 用符号 python3 表示 。。。

关于 Python 的问题,也可以向 hongqn 大人请教下啊,还可以顺便学学 Gentoo 。。。
ayanamist
2012-06-26 04:57:50 +08:00
@mckelvin 麻烦看清楚,pythonbrew的包隔离也是用virtualenv做的……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/40400

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX