5

我经常使用cx_freeze将我的 python 源与所有依赖项打包在一起,然后通过distutils bdist_msi扩展创建一个 msi 安装包

当我尝试重新安装新创建的 msi windows 安装程序而不卸载以前的版本时,会出现唯一的问题。卸载程序会记录所有以前卸载的软件版本,并记录注册表和卸载程序信息。

是否可以检测到我以前安装的软件版本并自动卸载它而不安装新版本?

我知道NSIS,以及如何使用它的 python 绑定来创建安装程序,我提到的上述问题可以通过它轻松解决。不幸的是,此时此刻,除了 Python 提供的 distutils 之外,我并没有看到任何东西。

4

2 回答 2

9

在 cx_Freeze 中,bdist_msi有一个选项upgrade-code文档将其描述为:

为创建的包定义升级代码;这用于在安装此软件包之前强制删除使用相同升级代码创建的任何软件包

要指定它,我认为您必须将其传递给setup()调用,如下所示:

options = {"bdist_msi": {"upgrade-code":"..."}}

(我总是忘记是否应该-_在选项名称中像这样使用它们,所以如果这是错误的,请尝试作为upgrade_code

微软说升级代码应该是一个 GUID(随机生成的代码)。

于 2012-12-20T18:35:00.017 回答
5

Thomas K 的答案很接近,但至少在我的情况下,并不准确。经过反复试验,我发现 GUID 需要用大括号括起来:

bdist_msi_options = {
    "upgrade_code": "{96a85bac-52af-4019-9e94-3afcc9e1ad0c}"
    }

并且这些选项需要与“build_exe”选项一起传递(一些在线示例对这些参数使用其他名称,但我发现只有 bdist_msi 有效):

setup(  # name, version, description, etc...
        options={"build_exe": build_exe_options, # defined elsewhere
                 "bdist_msi": bdist_msi_options},
        executables=[Executable("run.py",
                                base="win32GUI",
                                shortcutName="My Program name",
                                shortcutDir='ProgramMenuFolder')])

使用此代码,在我的情况下,以前的安装程序已正确卸载并从添加/删除程序列表中删除。

于 2013-10-21T16:52:23.890 回答