在我的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'一样。但是,我仍然无法使用JSON
和logging
,因为它们位于带有名称的文件夹中(包裹?)。
我觉得我只是缺少一些简单的东西,可能需要阅读更多关于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
同样,必须有一个更好的解决方案。
答案 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
目录中的子文件夹,这些子文件夹在原始正则表达式中被遗漏(仅包含模块)。现在,xml
,json
,logging
等软件包已纳入StdLib.dll