打包IronPython应用程序进行部署的最佳方法是什么?在搜索完网页之后,我想到的最好的办法(以及我目前正在做的)是使用clr.CompileModules()将整个项目的.py文件粘合到一个.dll中,然后使用一个run.py来运行该dll:import clr
clr.AddReference('compiledapp.dll')
import app
不过,这还不是最理想的,因为这意味着我必须分发3个文件(.dll、.xaml和run.py启动程序)
在主机上安装IronPython
另外,这感觉太。。。hacky,在IronPython与Visual Studio 2010完美集成之后。我完全搞不懂为什么IPy应用程序没有集成的构建系统,不管怎么说都归结为IL。
理想情况下,我希望能够有一个单独的.exe,其中.xaml以某种方式合并在内部(我读到C#apps将XAML编译成BAML并将它们合并到可执行文件中),并且不需要安装IronPython就可以运行。这至少有一半的可能吗?(我想如果exe需要一些额外的.DLLs或者其他东西,这是可以的。重要的是它是.exe格式的。)
一些编辑澄清了:我已经尝试了pyc.py,但似乎不承认我的项目不仅仅是app.py。它生成的exe的大小表明它只是“编译”app.py,而没有将任何其他文件包含到exe中。那么,如何告诉它编译我项目中的每个文件?
编辑二:不幸的是,唯一的方法是使用pyc.py并将每个文件作为参数传递给它。对于这种方法,我有两个问题:如何处理这么大的命令行?一个命令最多可包含256个字符。
pyc.py如何知道如何保留包/文件夹结构?如上面的项目截图所示,我编译的程序如何知道访问子文件夹中的模块,例如访问DT\Device?层次结构是否以某种方式“保留”在dll中?
Edit I I I:由于通过命令行将70个文件名传递给pyc.py将非常困难,为了更优雅地构建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
所以它正确地读取了.pyproj中的文件列表。。。伟大的!但是运行exe给了我这个:Unhandled Exception: IronPython.Runtime.Exceptions.ImportException:
No module named Cu64.ui
因此,尽管编译中显然包含了Cu64\ui.py,但运行exe时却找不到它。这就是我在上一次编辑中第2点所害怕的。如何保留项目的包层次结构?也许需要分别编译每个包?
我会延长这个问题的奖金。最终,我希望我们可以得到一个工作的pyc.py,它可以读取pyproj文件并一步生成工作的exe。然后也许它甚至可以提交到IronPython的codeplex中,以包含在下一个版本中。。。;]