编译IronPython WPF项目到exe

Aph*_*hex 22 python wpf ironpython visual-studio-2010

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

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

import app
Run Code Online (Sandbox Code Playgroud)

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

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

此外,在IronPython与Visual Studio 2010进行了精彩的集成之后,感觉如此...... hacky.我完全不知道为什么没有针对IPy应用程序的集成构建系统,因为它总体上归结为IL无论如何.

理想情况下,我希望能够以某种方式.exe.xaml内部合并一个单独的内容(我读到C#apps将XAML编译为BAML并将它们合并到可执行文件中),并且不需要安装IronPython来运行.这至少有一半可能吗?(我想如果exe需要一些额外的.DLL或者其他东西就可以了.重要的是它是.exe格式的.)


一些编辑要澄清:我已经尝试了pyc.py,但它似乎并不承认我的项目不仅仅是这样的事实app.py.它产生的exe的大小表明它只是"编译" app.py而不包含任何其他文件到exe中.那么,我如何告诉它编译我的项目中的每个文件?

为了帮助可视化,这是我项目的解决方案资源管理器窗口的屏幕截图.


编辑II:遗憾的是,唯一的方法是使用pyc.py并将每个文件作为参数传递给它.我对这种方法有两个问题:

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

编辑III:由于通过pyc.py命令行传递70个文件名将是不实用的,为了解决更优雅地构建IPy项目的问题,我决定增加pyc.py.

我添加了.pyproj通过/pyproj:参数读取文件的代码,解析XML,并从那里获取项目中使用的py文件列表.这一直很好; 但是,生成的可执行文件似乎无法访问属于我的项目的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
Run Code Online (Sandbox Code Playgroud)

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

Unhandled Exception: IronPython.Runtime.Exceptions.ImportException: 
No module named Cu64.ui
Run Code Online (Sandbox Code Playgroud)

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

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

jca*_*219 5

它"归结为IL",但它与C#代码生成的IL不兼容,因此无法直接编译为独立的.exe文件.您需要使用pyc.pyCompileModules创建的DLL将代码编译为存根EXE.然后分发这些文件IronPython.dll,IronPython.Modules.dll,Microsoft.Dynamic.dll,Microsoft.Scripting.Debugging.dll,Microsoft.Scripting.dll,,当然还有XAML文件.

要编译其他文件,只需将它们添加为参数: ipy.exe pyc.py /main:app.py /target:winexe another.py another2.py additional.py


Luk*_*sky 5

使用pyc.py生产app.exe,不要忘了,包括app.dll和IronPython库.

对于XAML - 我创建的项目仅用于.xaml我在VS中编译的文件,然后在IronPython中使用它们.例如:

<ResourceDictionary.MergedDictionaries>
  <ResourceDictionary Source="/CompiledStyle;component/Style.xaml" /> 
</ResourceDictionary.MergedDictionaries> 
Run Code Online (Sandbox Code Playgroud)


Nia*_*las 5

我发布了一个Python脚本,它可以获取IronPython文件,找出它的依赖关系并将该批量编译成Ironpython 2.6 .py - > .exe中的独立二进制文件.希望你觉得它有用.它应该也适用于WPF,因为它捆绑了WPF支持.