1

我对这个主题一无所知,但是我需要有关创建安装程序的最佳工具或方法的建议,该程序安装 python、一些自定义 python 模块、一些其他 python 模块(如 PIL)和一些 EXE 依赖项,所有这些都存在于网络存储库中, 在 Windows 机器上。存储库中有 python(msi 文件)、PIL(exe 文件)、自定义 python 模块(pyc 文件)和两个 Windows 可执行文件(以及 exe 文件和一个 zip 文件)的安装程序。欢迎任何建议。

4

2 回答 2

3

您可以使用任何安装程序应用程序来执行此操作。每个依赖安装程序都有一个静默安装选项,因此您的安装程序只需要以正确的顺序为每个依赖项调用安装程序。我不会特别推荐任何 Windows 安装程序应用程序,因为我不喜欢它们中的任何一个,但它们都会做你想做的事。

您拥有的另一个选项是使用 py2exe,它可以将所有内容捆绑到一个在其自己的 python 环境中运行的单个 exe 文件中。这样做的好处是您不必担心在用户环境中安装 Python 并让用户可能卸载 python 然后让您的应用程序停止工作,因为一切都在独立环境中。

我见过的其他方法是使用您喜欢的任何编译的 Windows 语言编写的自定义 exe 为您完成所有这些,但这需要大量工作。

您还可以在使用安装程序应用程序或处理安装的独立 exe 编写的安装程序上进行一些工作,通过手动将 python.exe、dll 和相关代码放置在适当的相对目录中来获得 py2exe 路由的优势到您的应用程序代码。当您的应用程序开始让一切正常运行时,您可能不得不弄乱您的 PYTHONPATH 环境设置,但这样您就不必担心安装 Python 以及用户是否已经安装了 Python 或者他们是否卸载了它,因为那时您有您需要与您的应用程序捆绑在一起的 Python 版本。

需要注意的一件事是,如果您担心 Python 安装程序本身在任何依赖项之前的大小约为 10 MB,但其中很多与使用您的应用程序的最终用户无关,则没有像这样的 Python 运行时环境安装程序一个 Java 运行时环境安装程序,它只安装运行 Python 所需的东西,你总能得到开发工具。

希望这有所帮助。

于 2012-10-25T01:23:45.767 回答
2

很好的回应迈克尔。

但是,py2exe 可能会吓到新手用户,对他们来说,使用 pyinstaller 1.5.1 可能更容易(有 2.x 可用,但它本身过于复杂,尽管它具有简单而强大的库挂钩 [你很可能不会需要])。

所有 pyinstaller 都需要进行配置(使用 Configure.py 自动配置),以及可执行文件的主要源文件,其余部分将由它负责。

下载pyinstaller后,可以将它的路径设置为环境变量,现在可以在批处理或cmd中大约三行制作一个可执行文件。

我通常会制作一个批处理脚本,让我可以轻松更改一些标签,将脚本放在我选择的目录中,然后一键生成可执行文件。

您的脚本可能类似于:

python %pyinstaller%/Configure.py

python %pyinstaller%/Makespec.py -F --icon=C:\Path\To\MyIcon.ico -n ExecutableName 
       C:\Path\To\Source\Main.py

python %pyinstaller%/Build.py ExecutableName.spec

此外,如果在规范文件可用之前调用 Build.py,您可能必须包含一个伪暂停。我把这一行:

ping -n 2 127.0.0.1>nul

在每个 %pyinstaller% 命令之间确保在它准备好之前没有调用任何内容,并且因为“暂停”需要一个键输入才能继续。“-n 2”将在继续之前暂停脚本 1 秒钟。

脚本运行后,它将创建两个目录(Build 和 dist)。您的独立可执行文件将位于“dist”文件夹中。

我已经将它用于我的所有应用程序,并且从未遇到过问题,除了与 PyMC 一起使用。这在其中一个模块中有一个垃圾库导入调用,它阻止了所有模块查找器跟随下一次导入,即使 py2exe 也不起作用。如果你遇到这样的事情,你很可能不得不进入模块源代码并修复垃圾。* 对于大多数图书馆来说,这种可能性非常小*

-- 编辑(2 分钟后) --

在发布后重新阅读您的问题后,您似乎需要一个实际的安装程序。

我建议使用 pyinstaller 使您的 python 可执行。创建的 EXE 将包含主脚本中的任何导入,因此您不必在主安装程序中包含 python、PIL、自定义模块的物理安装程序(只要它们在您的脚本中被引用)。现在是有趣的部分:

您将需要安装 InnoSetup。它是一个免费的开源程序,用于为 Windows 开发具有专业外观的安装程序。主安装程序需要一个脚本才能运行。这可能需要对语法进行一些阅读,但我会尽力为您提供 jist。

该脚本的语法与 Pascal 类似,该脚本中通常有 6 个部分在安装程序中使用:

[设置] 、 [文件] 、 [任务] 、 [图标] 、 [运行] 和 [代码]

[Setup] 部分包含有关安装程序的所有基本信息:

[Setup]
AppId={{123LKJESA-1441-FAKE-IDNO-THISWONTWRK}
OutputDir=.
OutputBaseFilename=MyInstaller
AppName=ExecutableName
AppVersion=1.0
AppPublisher=YourCompany
AppPublisherURL=http://www.URL.com
AppSupportURL=http://www.URL.com
AppUpdatesURL=http://www.URL.com
DefaultGroupName=A_GroupName
LicenseFile=C:\Path\To\Your\License.txt
DefaultDirName={pf}\MainDirName
WizardImageBackColor=$00001a
SetupIconFile=C:\Path\To\Icon.ico
Compression=lzma
SolidCompression=yes
  • 注意:AppID 对您的应用程序是唯一的,如果您创建新版本,此 ID 必须相同,否则安装程序会安装单独的 exe,卸载程序很有可能会崩溃。

此外,DefaultDirName 具有代表 Program Files 的键 {pf}。还有其他可用的位置键,可以在网站文档中找到。


[文件] - 此部分将包含安装程序所需的所有文件,并且它遵循非常标准的格式。您将需要一个 Source: 和一个 Destination (DestDir:)。其他有用的选项是 CopyMode,它告诉安装程序在重新安装时要做什么,以及 Flags:它提供了更多关于如何处理这个文件的选项。

例子:

[Files]
Source: C:\Path\to\my\created\python\executable.exe; DestDir: {app}; CopyMode: alwaysoverwrite;
Source: C:\Path\to\directory\of\files; DestDir: {localapp}; CopyMode: alwaysoverwrite; Flags: recursesubdirs;
  • 第一个源 destdir 中的 {app} 键是对应用程序目标的引用。
  • {localapp} 键将存储我给定目录中的所有文件,在用户本地应用程序数据文件中,python 应用程序可以引用该文件。

[任务] 将给用户选项来选择此应用程序的某些任务。在下面的示例中,我希望用户选择是否要拥有桌面图标。

[Tasks]
Name: "desktopicon" Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}";

[Icons] 部分非常不言自明,可以在在线文档中查找(而且这篇文章太长了)

最后是 [代码] 部分

这部分不是完全必要的,因为安装程序将在没有它的情况下以默认模式运行。但是,如果您想创建一个更复杂的安装程序,您可以在这里进行。这是普通程序员可以处理的部分,但如果你有 Pascal 的背景,它会真的很有帮助。在这里,您可以创建自定义窗口,设置 AfterInstall 和 BeforeInstall 检查(例如检查注册表是否已安装某些程序,否则在继续之前启动另一个安装程序)

-- 编辑 2 --

匆忙中,我忘记了 [Run] 部分。[运行] 部分为用户提供了在安装后立即运行应用程序的选项。这是一个示例,它将在最后一页上显示一个复选框,该复选框最初是未选中的,供用户选择是否要运行程序。

[Run]
Filename: "{app}\ExecutableName.exe"; Flags: nowait postinstall unchecked

*ReCap:一个好的应用程序和安装程序不应该要求用户安装 python 和使用的单独的库。使用 py2exe 或 pyinstaller 将创建一个独立的可执行文件,因此不需要在最终用户机器上安装这些文件。InnoSetup 将允许您创建安装程序,并将该可执行文件(和任何其他非 python 基本源)放置在所需的位置,以便它可以在您机器上的 .pyc 文件中运行时完全相同。

** 在部署您的应用程序之前,最好在不同的机器上测试您的应用程序和安装程序(或创建虚拟机)。例如。Windows 7 上的 {localappdata} 键指的是“C:\Users\UserName\AppData\Local”,而在 XP 上它指的是“C:\Documents and Settings\UserName\Local”(试图记住我的头顶所以可能是错的)。因此,如果您的程序正在访问用户的本地应用程序数据以存储文件,那么很有可能在 XP 上使用 os.environ['LOCALAPPDATA'] 会破坏路径链接。在 XP 上,InnoSetup 键 {userappdata} 将指向“C:\Documents and Settings\UserName\Application Data”,这是 python os.environ 映射指向的正确方向。使用“{userappdata}\Local”将产生正确的路径。但在 Windows 7 上,{userappdata} 将指向“C:\Users\UserName\AppData\Roaming”。因此,如果应用程序将向后兼容 Windows 版本,您将需要在 [Code] 部分设置一些代码,以确定正确的版本,并在使用哪个键上设置一个布尔标志。

在线文档的 URL 是:

http://www.jrsoftware.org/ishelp/

我希望您(或其他人)觉得这很有用,因为它是一个强大的工具,因为您包含在 [Files] 部分中的所有文件都将打包到独立安装程序中,并出现在您提供的目标位置中。尽管这可能有点冗长,但它应该为您制作可执行文件并使用安装程序打包它提供了一个真正的良好开端。

祝你好运!

于 2012-11-06T21:08:23.170 回答