gpt4 book ai didi

python - 将 IronPython WPF 项目编译为 exe

转载 作者:IT老高 更新时间:2023-10-28 20:34:34 31 4
gpt4 key购买 nike

打包 IronPython 应用程序以进行部署的最佳方式是什么?在网上搜索后,我想到的最好的事情(以及我目前正在做的事情)是使用 clr.CompileModules() 将整个项目的 .py 文件粘合到一个 .dll 中,然后让一个 run.py 执行此操作来运行 dll:

import clr
clr.AddReference('compiledapp.dll')

import app

不过,这仍然不是最理想的,因为这意味着我必须这样做

  1. 分发 3 个文件(.dll.xamlrun.py 启动器)
  2. 在主机上安装 IronPython

另外,在 IronPython 已经与 Visual Studio 2010 进行了精彩的集成之后,这感觉太……骇人听闻了。我完全不明白为什么没有用于 IPy 应用程序的集成构建系统,因为这一切都归结为无论如何,IL。

理想情况下,我希望能够以某种方式将单个 .exe.xaml 合并到内部(我读到 C# 应用程序将 XAML 编译为 BAML 并将它们合并在可执行文件中),并且无需安装 IronPython 即可运行。这至少有一半可能吗? (我想如果 exe 需要一些额外的 .DLL 或其他东西,那没关系。重要的是它是 .exe 形式的。)


一些需要澄清的编辑:我尝试过 pyc.py,但它似乎不承认我的项目不仅仅是 app.py。它生成的 exe 的大小表明它只是“编译” app.py 而不将任何其他文件包含到 exe 中。那么,我如何告诉它编译我项目中的每个文件呢?

To help visualize this, here is a screenshot of my project's solution explorer window.


Edit II: 不幸的是,似乎唯一的方法是使用 pyc.py 并将 每个文件 作为参数传递给它.对于这种方法,我有两个问题:

  1. 我怎么可能处理这么大的命令行?一条命令最多包含 256 个字符。
  2. pyc.py 如何知道要保留包/文件夹结构?如上面我的项目截图所示,我编译的程序如何知道访问子文件夹中的模块,例如访问 DT\Device?层次结构是否以某种方式“保留”在 dll 中?

Edit III:由于通过命令行将70个文件名传递给pyc.py会很笨拙,为了更优雅地解决构建IPy项目的问题,我决定增加 pyc.py

我添加了通过 /pyproj: 参数读取 .pyproj 文件、解析 XML 并获取在从那里开始的项目。这一直运作良好;但是,生成的可执行文件似乎无法访问我项目中的 python 子包(子文件夹)。我的 pyc.py 版本和我的 .pyproj 阅读支持补丁可以在这里找到:http://pastebin.com/FgXbZY29

当这个新的 pyc.py 在我的项目上运行时,输出如下:

c:\Projects\GenScheme\GenScheme>"c:\Program Files (x86)\IronPython 2.7\ipy.exe"
pyc.py /pyproj:GenScheme.pyproj /out:App /main:app.py /target:exe
Input Files:
c:\Projects\GenScheme\GenScheme\__init__.py
c:\Projects\GenScheme\GenScheme\Agent.py
c:\Projects\GenScheme\GenScheme\AIDisplay.py
c:\Projects\GenScheme\GenScheme\app.py
c:\Projects\GenScheme\GenScheme\BaseDevice.py
c:\Projects\GenScheme\GenScheme\BaseManager.py
c:\Projects\GenScheme\GenScheme\BaseSubSystem.py
c:\Projects\GenScheme\GenScheme\ControlSchemes.py
c:\Projects\GenScheme\GenScheme\Cu64\__init__.py
c:\Projects\GenScheme\GenScheme\Cu64\agent.py
c:\Projects\GenScheme\GenScheme\Cu64\aidisplays.py
c:\Projects\GenScheme\GenScheme\Cu64\devmapper.py
c:\Projects\GenScheme\GenScheme\Cu64\timedprocess.py
c:\Projects\GenScheme\GenScheme\Cu64\ui.py
c:\Projects\GenScheme\GenScheme\decorators.py
c:\Projects\GenScheme\GenScheme\DeviceMapper.py
c:\Projects\GenScheme\GenScheme\DT\__init__.py
c:\Projects\GenScheme\GenScheme\DT\Device.py
c:\Projects\GenScheme\GenScheme\DT\Manager.py
c:\Projects\GenScheme\GenScheme\DT\SubSystem.py
c:\Projects\GenScheme\GenScheme\excepts.py
c:\Projects\GenScheme\GenScheme\FindName.py
c:\Projects\GenScheme\GenScheme\GenScheme.py
c:\Projects\GenScheme\GenScheme\PMX\__init__.py
c:\Projects\GenScheme\GenScheme\PMX\Device.py
c:\Projects\GenScheme\GenScheme\PMX\Manager.py
c:\Projects\GenScheme\GenScheme\PMX\SubSystem.py
c:\Projects\GenScheme\GenScheme\pyevent.py
c:\Projects\GenScheme\GenScheme\Scheme.py
c:\Projects\GenScheme\GenScheme\Simulated\__init__.py
c:\Projects\GenScheme\GenScheme\Simulated\Device.py
c:\Projects\GenScheme\GenScheme\Simulated\SubSystem.py
c:\Projects\GenScheme\GenScheme\speech.py
c:\Projects\GenScheme\GenScheme\stdoutWriter.py
c:\Projects\GenScheme\GenScheme\Step.py
c:\Projects\GenScheme\GenScheme\TimedProcess.py
c:\Projects\GenScheme\GenScheme\UI.py
c:\Projects\GenScheme\GenScheme\VirtualSubSystem.py
c:\Projects\GenScheme\GenScheme\Waddle.py
Output:
App
Target:
ConsoleApplication
Platform:
ILOnly
Machine:
I386
Compiling...
Saved to App

所以它正确地读取了 .pyproj 中的文件列表...太好了!但是运行 exe 给了我这个:

Unhandled Exception: IronPython.Runtime.Exceptions.ImportException: 
No module named Cu64.ui

因此,即使 Cu64\ui.py 显然包含在编译中,exe 在运行时也找不到它。这就是我在上一次编辑的第 2 点中所担心的。如何保留项目的包层次结构?也许可能需要单独编译每个包?

我会延长这个问题的赏金。最终,我希望我们可以得到一个工作的 pyc.py,它可以读取 pyproj 文件并一步生成工作的 exe。然后也许它甚至可以提交到 IronPython 的 codeplex 以包含在下一个版本中...... ;]

最佳答案

使用 pyc.py 生成 app.exe 并且不要忘记包含 app.dll 和 IronPython 库。

至于 XAML - 我为 .xaml 文件创建了项目,我在 VS 中编译然后从 IronPython 使用它们。例如:

<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/CompiledStyle;component/Style.xaml" />
</ResourceDictionary.MergedDictionaries>

关于python - 将 IronPython WPF 项目编译为 exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3999489/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com