如何编写安装程序(安装python,python模块和其他依赖)的Windows框?

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

Solutions Collecting From Web of "如何编写安装程序(安装python,python模块和其他依赖)的Windows框?"

您可以使用任何安装程序在这里执行此操作。 每个从属安装程序都有一个无提示安装选项,因此您的安装程序只需以正确的顺序调用每个依赖项的安装程序。 我不会推荐任何Windows安装程序的应用程序,因为我不喜欢任何一个,但他们都会做你想做的。

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

我已经看到这样做的其他方式是用任何编译的Windows语言编写的自定义exe文件,你喜欢这样做,但这需要很多工作。

你也可以通过安装应用程序或独立的exe来处理安装,通过手动将python.exe,dll和相关的代码放到相应的相对目录中来获得py2exe路由的好处,到您的应用程序代码。 当您的应用程序开始使所有的工作都运行时,您可能不得不惹恼您的PYTHONPATH环境设置,但这样您不必担心安装Python以及用户是否已经安装了Python,或者如果他们卸载了它,您需要的Python版本与您的应用程序捆绑在一起。

有一点需要注意的是,如果你担心大小,Python安装程序本身在任何依赖关系之前大约是10 MB,但是很多与使用应用程序的最终用户无关,没有Python运行时环境安装程序一个Java运行时环境安装程序,只是安装你需要运行Python,你总是得到的开发工具。

希望这有所帮助。

尼斯的回应Michael。

但是,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 

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

 ping -n 2 127.0.0.1>nul 

在每个%pyinstaller%命令之间确保在准备好之前不会调用任何东西,并且因为“暂停”需要一个键入口才能继续。 “-n 2”将暂停脚本1秒钟,然后继续。

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

我已经用它来处理所有的应用程序,除了用于PyMC之外,从来没有遇到任何问题。 这有一个垃圾库导入调用的模块之一停止所有模块发现者下一个导入,即使py2exe不会工作。 如果遇到这样的情况,你很可能不得不进入模块源代码并修复垃圾。 *对于大多数图书馆来说这个机会非常渺茫*

– 编辑(2分钟后) –

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

我会建议使用pyinstaller来使你的python可执行文件。 创建的EXE将在主脚本中包括任何导入,因此您不必在主Installer程序中包含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}"; 

[图标]部分是非常明显的,可以在线查看文档(也是这个帖子太长了)

最后的[Code]部分

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

– 编辑2 –

我急忙忘了[Run]部分。 [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”,这是py os os.environ映射将指向的正确方向。 使用“{userappdata} \ Local”会产生正确的路径。 但在Windows 7上,{userappdata}将指向“C:\ Users \ UserName \ AppData \ Roaming”。 因此,如果应用程序向后兼容Windows版本,则需要在[代码]部分设置一些代码,以确定正确的版本,并设置一个布尔标志,以便使用哪个键。

在线文档的URL是:

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

我希望你(或其他人)觉得这很有用,因为它是一个强大的工具,因为你包含在[Files]部分中的所有文件将被打包到独立的安装程序中,并且会出现在你给它的目的地。 尽管这可能有点长,但它应该给你一个真正的良好的开始做可执行文件,并与安装程序打包。

祝你好运!