2010年5月2日星期日

用site包添加Python的导入路径

我前两天在Buzz上抱怨Windows系的同事在CentOS下喜欢在/data目录下建一个programfiles目录来安装软件是一件非常汗的事情,有同学回复说我是Linux原教旨主义者。我完全不是,我只是希望用什么就像什么,尽量沿着best practices的路子走,不要自己发明轮子,像我现在维护的代码,把Python用成了Java。这么用可以么?没事,当然可以,但是这是这肯定是在走弯路,而且在弯路上不知道埋伏着什么bug,会在你不注意的时候跳出来咬你。昨天我就是因为这样的bug而加班的。虽然硬着头皮上也能解决,最后也能学到东西,但我希望不要总是用这种方式才能学到东西,因为我很想在五一这个美好的假日能够捧上一本好书惬意的在阳光下睡觉。

问题的起源是我没法把在一个用apache+mod_wsgi跑起来的application之中import任何包,标准库也不行,比如logging或者sys。这个application原来是用tornado直接跑的。我想用框架写网站的同学可能都没有遇到过,我也是。一开始以为这大概是apache的配置问题,但左查右查都没有结果,因为后来管机器同事一气之下把python/apache/mod_wsgi全部重新make/install了一遍就好了,最后也没查出原因。没有logging这样的模块,仅仅靠apache那点可怜的日志,鬼知道后面出的错如何解决。

CentOS是个很保守的系统,自带的Python还是2.4的,升级是不可能完成的任务。于是一般的做法是自己编译安装一个Python2.5/2.6来用。我这时才发现programfiles这个奇葩的所在。/usr/local/目录下面也不是标准的bin/lib/share...的目录结构,而是和这个/data/programfiles一一对应的软链接-_-。在让mod_wsgi使用我们自己编译安装的Python2.5之后,发现无法import第三方的库,但这个第三方的库明明用easy_install安装过啊,2.4/2.5都装了,咋还不行捏?经过差不多是把显示器贴到脸上去的检查,发现标准的路径(sys.path)里写的是 /usr/local/lib/python2.5/site-packages,而我们的山寨路径是 /usr/loca/python/lib/python2.5/site-packages。这两个有区别哈,但是第一眼真的很难看出来。

OK,把山寨路径加入到sys.path中?还是不行。我现在的感情真的很脆弱,干脆坏事做到底,直接把 /usr/local/lib/python2.5 目录删了,改成软链接连到 /usr/local/python/lib/python2.5 目录下。现在第三方库可以了。哦,不,还不是全部可以,而是有的可以有的不行……囧!实验了多次,发现一个问题,.pth文件指向的那些路径下的包都没法import。上google,上stackoverflow,上baidu,".pth"这个关键字相关的东西非常少,人家一般都给你匹配成path。就在我晕头转向之际,不知道什么时候手一抖,点开了一个stackoverflow问题的链接,里面有一位大神说,只把路径加入到sys.path是不够的,这样.pth文件不会被解析,要用site.addsitedir才行。哎呀呀,终于成了……

不写了,爬山去了。

没有评论:

发表评论