【问题标题】:IronPython with WPF compile exe pyc errorIronPython 与 WPF 编译 exe pyc 错误
【发布时间】:2017-11-10 21:43:39
【问题描述】:

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

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

包含所有相关 DLL 的项目的哪个 XAML 文件位于部署文件夹中,但是,我收到以下错误,我无法理解是什么意思:

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 文件。

【问题讨论】:

  • 您能否分享该教程的链接或简要介绍文件中的内容?
  • @Ayushya 这是一个链接。 link该文件包含一些简单的文件操作(R/W)。
  • 当我在研究如何解决这个问题时,我遇到了this 看看它是否有帮助。在那之前,我正在研究细节。
  • @Ayushya 谢谢我之前看过这篇文章,但没有人提到在编译过程中这个错误信息是什么。
  • Here 我查找了“Ambiguous”这个词,但我不明白“方法错误地转换为 PythonFunction”是什么意思。

标签: python .net wpf ironpython pyc


【解决方案1】:

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

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

请注意,如果没有 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: 选项,它将不起作用!

【讨论】:

  • 终于找到了一个真正有效的解决方案。非常感谢您发布此内容。
  • 我复制/粘贴了上面的代码,但它仍然对我不起作用......我还没有找到运行编译后的 exe 后“没有名为 wpf 的模块”错误的解决方案......它具有讽刺意味的是 IronPython 如何无缝集成 .NET,但您却无法分发您的程序。这有什么好处?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
相关资源
最近更新 更多