转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=3087

自从2011年KlayGE在代码库中包含所有第三方库以来,Python一直都是基于3.2的版本,这几年来Python本身的发展都没跟上。最近打算把Python移植到WinRT平台,所以干脆先一鼓作气,更新到最新的3.4.1上。

升级3.4.1

把代码更新到3.4.1,虽然文件添加、删除、修改都很多,但cmake里只要做很少的修改,就能完成编译和执行。但原装的python仍然不支持android,所以还得把以前的补丁手工修改到新版本上。另外,默认情况下python用的是mbcs进行编译的,改成unicode之后有几个编译错误,也顺便修改了。纯unicode版本的好处是,Lib/encode目录下不再需要带着各种编码的.py文件,全都用utf-8就行了。

WinRT的支持

原装的python也不支持WinRT。如果直接编译,会有上千个错误。找来找去,最终在python的sandbox分支里找到了Martin v. Löwis做的WinRT试验。根据他的修改,可以生成用于WinRT的静态库,连接到WinRT app也不是问题了。

但执行的时候,仍然不行。因为python在运行的时候需要Lib目录下的一些文件,而那些文件即使放入WinRT的部署目录,也没法被import。我跟踪了很久也没发现它的import是如何读取文件的,但却发现了zipimport用的是fopen之类WinRT支持的函数。所以,只要把Lib目录和你自己的py脚本都放到一个zip包里,在调用Py_Initialize前用Py_SetPath指定给python。这样一来,WinRT下只要单纯一个存放.py的zip包,就能正常使用python脚本引擎,其他代码都不用改。

未来

下一步还打算做个可用的android支持。其实问题也是出在import上。既然发现了zipimport的方法,以后也可以进一步尝试在android上这么来完成import。