【问题标题】:Compiling IronPython into an exe that uses standard library packages将 IronPython 编译成使用标准库包的 exe
【发布时间】:2014-06-06 23:14:08
【问题描述】:

在我的 IronPython 脚本中,我使用标准库模块,例如 ConfigParser、日志记录和 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) 制作了从上面的链接生成的 StdLib.dll 文件 (IronPython: EXE compiled using pyc.py cannot import module "os")。这将缺少标准库包。

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

3) 使用 SharpDevelop 构建我的程序并将所有参考资料联系在一起。 - 参考第 2 步中生成的 dll - 引用步骤 1 中的 StdLib.dll

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

【问题讨论】:

    标签: python ironpython


    【解决方案1】:

    我找到了两种编译标准库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

    【讨论】:

    • 回过头来看我的答案应该是使用目录行走类来完成这个。我提供了课程,但没有复制正确的代码。对不起
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2012-04-17
    相关资源
    最近更新 更多