将IronPython编译为使用标准库包的exe

时间:2014-06-05 15:32:14

标签: python ironpython

在我的IronPython脚本中,我使用标准的库模块,如ConfigParser,logging和JSON。

然后我使用pyc.py创建一个可执行文件。起初我遇到了问题,即'...ImportException: no module named ...' 因为他们没有被包括在exe和随附的dll中。

所以我从这里开始运行一个解决方案:IronPython: EXE compiled using pyc.py cannot import module "os"它主要起作用。

例如,导入'ConfigParser'会起作用,因为在IronPython'Lib'文件夹中作为模块,它就像'ConfigParser.py'一样。但是,我仍然无法使用JSONlogging,因为它们位于带有名称的文件夹中(包裹?)。

我觉得我只是缺少一些简单的东西,可能需要阅读更多关于python模块以及它们是如何工作的,但我不确定我应该寻找什么。 任何帮助将不胜感激。

谢谢!

修改

我还不能回答我自己的问题,所以我会把它留在这里。

以某种方式让它以真正'hacky'的方式工作。必须有另一个更清洁的解决方案,我缺少(pyc.py中的一些选项?)

这就是我的所作所为:

1)制作了从上面的链接(IronPython: EXE compiled using pyc.py cannot import module "os")生成的StdLib.dll文件。这将缺少std lib包。

2)使用SharpDevelop按照以下方法编译上面dll中未包含的标准lib包:http://community.sharpdevelop.net/blogs/mattward/archive/2010/03/16/CompilingPythonPackagesWithIronPython.aspx

3)使用SharpDevelop构建我的程序并将所有引用绑定在一起。   - 参考步骤2中制作的dll   - 引用步骤1中生成的StdLib.dll

同样,必须有一个更好的解决方案。

1 个答案:

答案 0 :(得分:0)

我发现了两种编译标准库python包的方法:

第一种方式:单独将每个包编译成一个dll 使用pyc.py,运行类似(此示例编译logging包):

ipy pyc.py ".\Lib\logging\__init__.py" ".\Lib\logging\config.py" ".\Lib\logging\handlers.py" /target:dll /out:logging

这将创建一个logging.dll文件,您可以按照以下方式使用该文件:

import clr
clr.AddReference('StdLib') #from the compilation of non-package std libraries


clr.AddReference('logging')
import logging

**注意:假设您从IronPython: EXE compiled using pyc.py cannot import module "os"运行解决方案以创建StdLib.dll

第二种方式:修改生成StdLib.dll的编译脚本

我更改了这一行:

#Build StdLib.DLL
gb = glob.glob(r".\Lib\*.py")
gb.append("/out:StdLib")   

对此:

#Build StdLib.DLL
gb1 = glob.glob(r".\Lib\*.py")
gb2 = glob.glob(r".\Lib\*\*.py")
gb3 = glob.glob(r".\Lib\*\*\*.py")
gb = list(set(gb1 + gb2 + gb3))
gb.append("/out:StdLib")

这包括Lib目录中的子文件夹,这些子文件夹在原始正则表达式中被遗漏(仅包含模块)。现在,xmljsonlogging等软件包已纳入StdLib.dll