码迷,mamicode.com
首页 > 编程语言 > 详细

IronPython打包记录之一:源码打包(转)

时间:2014-12-17 18:01:51      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   ar   io   color   sp   for   on   

原文链接: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打包记录之一:源码打包(转)

标签:style   blog   http   ar   io   color   sp   for   on   

原文地址:http://www.cnblogs.com/zhangjunjun203/p/4169799.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!