2014-06-05 57 views
1

在我的IronPython脚本中,我使用了标准库文件模块,如ConfigParser,logging和JSON。将IronPython编译为使用标准库包的exe文件

然后我用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模块以及它们是如何工作的,但我不知道我应该在寻找什么。 任何帮助将不胜感激。

谢谢!

编辑:

我不能回答我的问题,所以我会在这里离开这个。

不知何故,它以一种非常'黑客'的方式工作。必须有另一种更简洁的解决方案,这一点,我很想念

这里就是我所做的(在pyc.py一些选项):

1)制造从上面的链接所产生的StdLib.dll文件( IronPython: EXE compiled using pyc.py cannot import module "os")。这将会丢失std lib软件包。使用SharpDevelop的编译未包括在上述的dll标准lib包下这里的方法

2):用于SharpDevelop的建立了一个程序,将所有的引用一起http://community.sharpdevelop.net/blogs/mattward/archive/2010/03/16/CompilingPythonPackagesWithIronPython.aspx

3)。 - 参考步骤2中制作的dll - 参考步骤1中提供的StdLib.dll

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

回答

0

我发现两种方法编制标准库Python包:

1的方式:每包单独编译成一个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目录当中得到了原正则表达式错过了子文件夹(仅适用于模块获得包括在内)。现在,像xml,json,等包这样的包被纳入StdLib.dll

+0

回想起来,我的答案应该使用目录行走类来实现这一点。我提供了这个类,但没有复制正确的代码。抱歉 – WombatPM