如何在没有Visual Studios(可能使用py2exe)的情况下将IronPython应用程序编译为EXE?

6
所以在来这里问之前,我试着寻找过答案了。将IronPython应用程序/脚本转换为EXE似乎是可行的。唯一的问题是,它们都似乎在谈论使用IronPython Studios和Visual Studios的Python插件。据我所知,IronPython Studios已经被Python Tools for Visual Studios(或PTVS)插件工具取代。由于我的代码结构,它实际上成功地使插件崩溃,因此无法在IDE中加载我的代码。直到下个月底或下个月初的下一个定期更新才能解决这个问题。所以这不是一个选项,因为我不得不在Eclipse中开发我的项目并使用PyDev插件。

我曾经使用过py2exe将一些基本的Python应用程序转换为可执行文件,但那是当我使用CPython解释器时。我不知道如何设置py2exe以与IronPython配合使用。是否可以使用py2exe制作IronPython可执行文件?如果我的程序使用额外的C#程序集来完成其工作,那么我该如何设置这些程序集,以便py2exe可以使用它们,并且我的可执行文件可以看到它们以供引用?

3个回答

6
IronPython附带了一个命令行编译器pyc.py(在Tools\Scripts文件夹中),您可以使用它。另一种选择是使用SharpDevelop将您的IronPython代码编译为可执行文件。

如果C#程序集在GAC中或与可执行文件位于相同文件夹中部署,则已编译的IronPython应用程序可以使用它们。


6

我使用的是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")

我使用一个Python脚本制作了类似以下内容的StdLib.dll。
#...
#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"

3

Pyc.py是直接编译的最佳选择,因为Python Tools for Visual Studio不支持直接编译。SharpDevelop针对Ironpython具有自定义构建操作。在PTVS发布之前,我一直使用#Develop。

请参阅此问题IronPython:使用pyc.py编译的EXE无法导入模块“os”以获取详细步骤以制作您的EXE。记得编译您正在使用的标准库模块。如果您必须让用户下载和安装IronPython,则不需要编译脚本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接