打包IronPython应用程序以进行部署的最佳方式是什么?在浏览网页后,我想到的最好的东西(以及我目前正在做的)是使用clr.CompileModules()
将我整个项目的.py文件粘贴到一个.dll文件中,然后使用一个run.py
来执行此操作DLL:将IronPython WPF项目编译为exe
import clr
clr.AddReference('compiledapp.dll')
import app
这仍然是最理想的,但是,因为这意味着我必须
- 分发3个文件(
.dll
的.xaml
和run.py
发射) - 上安装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.
编辑II:看来,不幸的是,唯一的办法就是使用pyc.py
并通过每一个文件把它作为一个参数。这个方法有两个问题:
- 我该如何处理一个大的命令行?命令中最多有256个字符。
- pyc.py如何知道如何保留包/文件夹结构?如上面我的项目屏幕截图所示,我的编译程序如何知道访问子文件夹中的模块,比如访问DT \ Device?这个层次结构是否“保存”在dll中?
编辑III:由于经过70名到pyc.py
通过命令行会笨重,以及解决更优雅建筑IPY项目的问题的兴趣,我决定增加pyc.py
。
我已经添加了通过/pyproj:
参数读取.pyproj
文件的代码,解析XML,并从那里获取项目中使用的py文件列表。这一直工作得很好;但是,生成的可执行文件似乎无法访问作为我的项目一部分的python子包(子文件夹)。我与我的.pyproj
阅读支持补丁pyc.py
版本可以在这里找到: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运行时,无法找到它。这是我在之前的编辑中第二点中所害怕的。我如何保留我的项目的包层次结构?也许需要分别编译每个软件包?
我会延长这个问题的赏金。最终,我的希望是,我们可以得到一个可读取pyproj文件的工作pyc.py,并一步完成工作。那么它可能甚至会被提交给IronPython的codeplex以包含在下一个版本中...;]
命令行长度为8191个字符(http://support.microsoft.com/kb/830473)。 'clr.CompileModules'很好地处理了包 - 它通过'__init __。py'识别它们,就像通常用于Python包一样。 – 2010-10-28 15:38:12
是的,您可以使用clr.CompileModules,然后生成加载.dll的存根.exe文件。我认为有一个LoadAssembly函数可以在C#中使用。 – jcao219 2010-10-28 21:04:59
啊 - 我的意思是'pyc.py'使用'clr.CompileModules'来处理软件包。所以只需使用pyc.py,它应该可以工作;-) – 2010-10-29 00:30:29