我曾经使用过py2exe将一些基本的Python应用程序转换为可执行文件,但那是当我使用CPython解释器时。我不知道如何设置py2exe以与IronPython配合使用。是否可以使用py2exe制作IronPython可执行文件?如果我的程序使用额外的C#程序集来完成其工作,那么我该如何设置这些程序集,以便py2exe可以使用它们,并且我的可执行文件可以看到它们以供引用?
我曾经使用过py2exe将一些基本的Python应用程序转换为可执行文件,但那是当我使用CPython解释器时。我不知道如何设置py2exe以与IronPython配合使用。是否可以使用py2exe制作IronPython可执行文件?如果我的程序使用额外的C#程序集来完成其工作,那么我该如何设置这些程序集,以便py2exe可以使用它们,并且我的可执行文件可以看到它们以供引用?
如果C#程序集在GAC中或与可执行文件位于相同文件夹中部署,则已编译的IronPython应用程序可以使用它们。
我使用的是IronPython 2.7.8和ipyc.exe,而不是Tools\Scripts\pyc.py,并且它们之间存在一些差异,因此我在这里留下了一些信息。
1. 使用/embed和/standalone选项
如果你将脚本分成多个py文件,请使用/embed选项和/main选项,它们将生成一个包含所有py脚本文件的单个exe文件。 例如,如果你有"MyMain.py"脚本和"OtherFuncs.py",则应按如下方式操作。
C:\Program Files\IronPython 2.7\ipyc.exe /main:MyMain.py OtherFuncs.py /embed /platform:x86 /standalone /target:winexe
/standalone选项用于包括C:\Program Files\IronPython 2.7\文件夹下基本的IronPython dll文件,如IronPython.dll、IronPython.Modules.dll、Microsoft.Dynamic.dll和Microsoft.Scripting.dll。
但要注意,DLLs/IronPyton.SQLite.dll和DLLs/IronPtyhon.WPF.dll未被包括在内,因此如果你在脚本中使用WPF或SQLite功能,则还应该将这些dll文件复制并与你的exe文件一起分发,并在你的脚本中添加以下行:
clr.AddReference("IronPython.Wpf")
clr.AddReference("IronPython.SQLite")
2. C:\Program Files\IronPython 2.7\Lib 文件夹下的库脚本文件
你的脚本使用许多标准函数,这些函数由 C:\Program Files\IronPython 2.7\Lib 文件夹下的库脚本文件支持,因此你需要将这些脚本文件与你的 exe 文件一起分发。
有两个选项,一个是将 Lib 文件夹直接复制到包含 exe 文件的文件夹中,另一个是生成一个包含所有标准库脚本文件的 StdLib.dll,具体命令如下所示。
C:\Program Files\IronPython 2.7\ipyc.exe /main:StdLib.py io.py sys.py ...所有必要的脚本文件... /embed /platform:x86 /target:dll
StdLib.py 只是一个大小为 0 的空文件,它是生成单个 dll 文件的技巧。你应该在你的脚本的第一行添加以下代码。
import clr
clr.AddReference("StdLib")
#...
#Build StdLib.DLL
ipath = 'C:\Program Files\IronPython 2.7'
ipyc = ipath + '\ipyc.exe'
# any library files you need
gb += glob.glob(r".\Lib\*.py")
gb += glob.glob(r".\Lib\encodings\*.py")
# ...
gb = [ipyc,"/main:StdLib.py","/embed","/platform:x86","/target:dll"] + gb
subprocess.call(gb)
print "Made StdLib"
Pyc.py是直接编译的最佳选择,因为Python Tools for Visual Studio不支持直接编译。SharpDevelop针对Ironpython具有自定义构建操作。在PTVS发布之前,我一直使用#Develop。
请参阅此问题IronPython:使用pyc.py编译的EXE无法导入模块“os”以获取详细步骤以制作您的EXE。记得编译您正在使用的标准库模块。如果您必须让用户下载和安装IronPython,则不需要编译脚本。