IronPython与WPF编译exe pyc错误

时间:2017-07-29 17:47:03

标签: python .net wpf ironpython pyc

我使用带有WPF的IronPython 2.7开发了一个使用VS2017的应用程序,使用ipy命令可以正常工作。我想从项目创建一个exe文件,所以我在cmd中使用了以下命令:

ipy pyc.py /main:IronPython5.py /target:winexe

包含所有相关DLL的项目的XAML文件位于deploy文件夹中但是,我得到以下错误,我无法理解其含义:

Traceback (most recent call last):
  File "pyc.py", line 332, in <module>
  File "pyc.py", line 327, in Main
  File "pyc.py", line 181, in GenerateExe
SystemError: Ambiguous match found.

Ironpython5.py包含:

import wpf
from System.Windows import MessageBox
from System.Windows import Application, Window

class MyWindow(Window):
    def __init__(self):
        self.str1 = ""
        wpf.LoadComponent(self, 'IronPython5.xaml')
    def Button_Click(self, sender, e):
        if self.str1 == "":
            MessageBox.Show("msg1")
        else:
            MessageBox.Show("msg2")
        pass

if __name__ == '__main__':
    Application().Run(MyWindow())

以及IronPython5.py包含:

<Window 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       Title="IronPython5" Height="300" Width="300"> 
       <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Margin="159,238,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
    </Grid>
</Window> 

dll文件是:

  • IronPython.dll
  • IronPython.Modules.dll
  • Microsoft.Dynamic.dll
  • Microsoft.Scripting.dll
  • Microsoft.Scripting.Metadata.dll

请帮我解决如何修复此错误以生成exe文件。

1 个答案:

答案 0 :(得分:4)

我刚刚按照this solution提供的一些提示运行了我的示例WPF IronPython项目,但我使用了ipyc.exe来编译它,这是我的IronPython 2.7.7安装附带的。

为了在最终的可执行文件中拥有所有依赖项,您必须手动加载它们。

请注意,如果没有try / except块,这将无法在Visual Studio中运行,因为VS可能已经添加了这些

import clr

try:
    clr.AddReferenceToFileAndPath("IronPython.Wpf.dll")
    clr.AddReferenceToFileAndPath('PresentationCore.dll')
    clr.AddReferenceToFileAndPath('PresentationFramework.dll')
    clr.AddReferenceToFileAndPath('WindowsBase.dll')
except:
    pass

from System.Windows import Application, Window

import wpf

class MyWindow(Window):
    def __init__(self):
        wpf.LoadComponent(self, 'Wpf_Example.xaml')


if __name__ == '__main__':
    Application().Run(MyWindow())

然后将dll添加到项目文件夹中。它们可以在这里找到:C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \

用ipyc编译

ipyc Wpf_Example.py /target:winexe

注意拨打ipyc的不同方式!如果使用/ main:选项,它将无法工作!