2014-06-05 56 views
1

在我的IronPython腳本中,我使用了標準庫文件模塊,如ConfigParser,logging和JSON。將IronPython編譯爲使用標準庫包的exe文件

然後我用pyc.py來創建一個可執行文件。起初,我遇到了一些問題,即'...ImportException: no module named ...' ,因爲它們沒有被包含在exe和附帶的dll中。

所以我從這裏運行了一個解決方案:IronPython: EXE compiled using pyc.py cannot import module "os"它大部分工作。

例如,導入'ConfigParser'會在IronPython'Lib'文件夾中作爲一個模塊工作,它在那裏作爲'ConfigParser.py'。不過,我仍然在使用JSONlogging時遇到問題,因爲它們位於文件夾內(包?)。我感覺我只是缺少一些簡單的東西,可能需要閱讀更多關於python模塊以及它們是如何工作的,但我不知道我應該在尋找什麼。 任何幫助將不勝感激。

謝謝!

編輯:

我不能回答我的問題,所以我會在這裏離開這個。

不知何故,它以一種非常'黑客'的方式工作。必須有另一種更簡潔的解決方案,這一點,我很想念

這裏就是我所做的(在pyc.py一些選項):

1)製造從上面的鏈接所產生的StdLib.dll文件( IronPython: EXE compiled using pyc.py cannot import module "os")。這將會丟失std lib軟件包。使用SharpDevelop的編譯未包括在上述的dll標準lib包下這裏的方法

2):用於SharpDevelop的建立了一個程序,將所有的引用一起http://community.sharpdevelop.net/blogs/mattward/archive/2010/03/16/CompilingPythonPackagesWithIronPython.aspx

3)。 - 參考步驟2中製作的dll - 參考步驟1中提供的StdLib.dll

同樣,必須有更好的解決方案。

回答

0

我發現兩種方法編制標準庫Python包:

1的方式:每包單獨編譯成一個dll 使用pyc.py,運行像(這個例子編譯logging包):

ipy pyc.py ".\Lib\logging\__init__.py" ".\Lib\logging\config.py" ".\Lib\logging\handlers.py" /target:dll /out:logging 

這將創建一個logging.dll文件,然後你就可以使用這樣的:

import clr 
clr.AddReference('StdLib') #from the compilation of non-package std libraries 


clr.AddReference('logging') 
import logging 

**注:這是假設你運行該解決方案從IronPython: EXE compiled using pyc.py cannot import module "os"創建StdLib.dll

第二個辦法:修改生成STDLIB編譯腳本。DLL

我改變了這一行:

#Build StdLib.DLL 
gb = glob.glob(r".\Lib\*.py") 
gb.append("/out:StdLib") 

要這樣:

#Build StdLib.DLL 
gb1 = glob.glob(r".\Lib\*.py") 
gb2 = glob.glob(r".\Lib\*\*.py") 
gb3 = glob.glob(r".\Lib\*\*\*.py") 
gb = list(set(gb1 + gb2 + gb3)) 
gb.append("/out:StdLib") 

這包括Lib目錄當中得到了原正則表達式錯過了子文件夾(僅適用於模塊獲得包括在內)。現在,像xml,json,等包這樣的包被納入StdLib.dll

+0

回想起來,我的答案應該使用目錄行走類來實現這一點。我提供了這個類,但沒有複製正確的代碼。抱歉 – WombatPM