首页 > 代码库 > IronPython打包记录之一:源码打包(转)
IronPython打包记录之一:源码打包(转)
原文链接:http://xufive.blog.163.com/blog/static/17232616820125159303126/
一年前用IronPython写过一个调用.NET动态库的程序,在打包成可执行程序时遇到了麻烦。当时因为项目工期紧,只好用python在外面做了一层包装,匆匆交差了事。最近,这个项目又被挖掘出来了:我的客户把它卖到了BD。正好借此机会,处理掉历史遗留问题。
阅读文档,才知道IronPython自带一个名为pyc.py打包脚本,在安装路径下的\Tools\Scripts文件夹中。pyc.py可以生成dll文件,也可以生成exe文件,还可以生成windows程序。一个典型的用法如下:
ipy.exe pyc.py /main:Program.py Form.py /target:winexe
main后面的第一个文件是主程序,其他脚本程序(如果有的话)依次写在后面。target表示生成的目标类型,winexe表示生成的是windows程序。
看起来似乎很简单,但我的程序打包时总是出错,错误信息如下:
SystemError: Unable to make a reference to a transient module from a non-transient module.
瞬态模块?这是个啥东东?满世界google了一天,终于觅得了些许蛛丝马迹:Supplying 13 arguments to a Python function taking variable arguments causes a clr.CompileModules failure; 12 arguements compiles fine. 中国话的意思是,函数的可变参数中有13个参数,编译失败,12个参数,编译正常。
居然会有这样隐蔽的bug?看看我的代码,真有这样的一行:
class RfidReader():
def __init__(self, readerName, ip, user, passwd, **cfg):
**cfg就是一个字典类型可变参数,该类实例化时,提供了10个参数:
insidePin=1, outsidePin=3, redPin=0, greenPin=1, inMode=‘S‘, redDelay=5000, greenDelay=3000, port=3000, timeout=1000, readMode=‘OnDemand‘
加上readerName, ip, user, passwd等4个参数,共计14个,的确超过了13个!难道真的是这个原因吗?把相对较为固定的port=3000, timeout=1000, readMode=‘OnDemand‘等3个参数写在代码中,只剩下11个参数,再次运行打包程序,哈哈,终于成功了。
不过,我高兴得太早了,编译打包之后的程序跑不起来!我的源代码在ipy解释器上能够顺利运行,应该不是代码的问题。想来想去,只有一种可能:我的程序调用了一个.NET的动态库,而pyc.py似乎只能编译IronPython脚本程序,不能打包dll文件和其他资源文件。
那么,真的无路可走了吗?继续迷茫中……
IronPython打包记录之一:源码打包(转)