打包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