Sunday, 2 April 2006

Python Egg的形式

看过xpl223的prefix问题,今天想do something。在做了几个简单的测试之后,基本上把问题锁定在Routes上面。Routes,和其它的Python组件一样,是以Python Egg的形式安装在系统中的。

安装之后的Python Egg,有两种形式。一是.egg,一个完整的包文件;另外一种就是,egg展开之后的形式,通常单独建立一个子目录,目录名也是以.egg结尾的。Python Egg在安装以后,会在文件easy-install.pth里面注册。所谓的“注册”,其实也就是增加一行纪录,说明easy_install的包在那里。在easy-install.pth中,是看不出egg以那种形式存在的,具体的要看site-packages。事实上,egg的形式并不重要,两种方式都可以正常工作。

那为什么要有两种形式?包方式就很简单,为什么还要展开?我的理解,一些egg相对比较独立,和其它组件关联不大,或者它总是处于被调用的位置。这时候,包方式就比较简单。另外一些egg,属于容器类型的,比如Paste,本身是个框架,其它egg在安装的时候,会在此egg里放置一些代码。这种情况下,无疑需要将egg扩展开来才行。

回到最初的问题,Routes在安装后,还是egg包的形式,没有展开。而我需要对Routes进行debugging,那就只好自己手工展开了。egg包,采用的是比较普通的打包方法(pkzip?),用WinZip就可以打开,当然我自己喜欢用的是7Zip)。把原来的Routes-1.3-py2.4.egg改名,新建一个Routes-1.3-py2.4.egg目录,然后把egg包里东西extract到该目录中。重新启动Plons App,一切都依旧运行。不过这时候,就可以修改Routes的代码,增加调试信息,想怎么Hack都可以。

最后,xpl223的prefix问题锁定在site-packages/routes-Routes-1.3-py2.4.egg/routes/base.py中的class Mapper::_match函数。此段代码在增加了prefix选项后,只对第一个route进行match,然后就乱套了。看了看Route Trac上的代码,这个地方已经打了补丁。现在只要将Routes升级到最新版本,问题就解决了。

1 Comments:

At 02 April, 2006 23:57, Anonymous xlp223 said...

呵呵,还是你动作快,我昨晚已经注意到了routes的问题了,还没有仔细看,忙着其他事呢。

 

Post a Comment

<< Home